Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Я могу обновить строку заголовка?

Автор вопроса: Ilan TalОтветов: 1

В предыдущем вопросе я спросил об обновлении строки меню. BalusC сказал мне, что мне нужно добавить форму, содержащую строку меню.

Я хотел бы расширить этот вопрос, чтобы спросить, могу ли я обновить текст в заголовке. Используется шаблон, и я заполняю значение, используя

    <ui:define name="AreaTitle">
        #{viewBacking.current.firstName}  #{viewBacking.current.surName}
    </ui:define>

Шаблон имеет

<h:head>
<title><ui:insert name="AreaTitle">Master template</ui:insert></title>
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />
</h:head>

Кажется странным определять форму в заголовке, поэтому ни одна из них не определена. Я поставил точку останова в viewBacking.current, чтобы видеть, когда он ее использует. Даже если я нажму кнопку "Обновить", чтобы повторно отобразить форму, она больше не столкнется с точкой останова. Только когда я перехожу на другую страницу с другим содержимым, она снова достигает точки останова. Для обновления

public void refreshForm() {
    RequestContext context = RequestContext.getCurrentInstance();
    context.update("menuForm:masterMenuBar");
    context.update("AreaTitle");
}

Это показывает предыдущее решение, которое BalusC дал мне на masterMenuBar. Вполне может быть, что я не могу сделать то, о чем прошу, но мне нужно подтверждение, если это так.

Спасибо, Илан

ajaxjsfprimefaces

Ответы

Ответ 1 · рейтинг 4 · BalusC

Вы не можете обновить заголовок с помощью обновления JSF ajax просто потому, что <title> не является компонентом JSF. Вы также не можете помещать компоненты HTML или JSF в <title>, это незаконный синтаксис HTML.

Лучше всего вместо этого использовать JavaScript для обновления заголовка, назначив его document.title. Вы можете использовать RequestContext#execute() для этого.

String fullName = current.getFirstName() + " " + current.getSurName();
context.execute("document.title='" + fullName + "'");

Поскольку это данные, контролируемые пользователем, я бы использовал StringEscapeUtils#escapeJavaScript(), чтобы избежать потенциального Дыры для XSS-атак.

String fullName = current.getFirstName() + " " + current.getSurName();
context.execute("document.title='" + StringEscapeUtils.escapeJavaScript(fullName) + "'");

Альтернативой является использование OmniFaces <o:onloadScript>.

<o:onloadScript>document.title='#{of:escapeJS(viewBacking.current.firstName)} #{of:escapeJS(viewBacking.current.surName)}'</o:onloadScript>

Это будет выполняться повторно при каждом запросе ajax.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы