Вопрос по ajax, jsf, primefaces – я могу обновить строку заголовка?

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. Вполне может быть, что я не могу сделать то, что я прошу, но мне хотелось бы получить подтверждение, если это так.

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

Ваш Ответ

1   ответ
4

Вы не можете обновить заголовок с помощью обновления AJAX JSF просто потому, что<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.

Error: User Rate Limit Exceeded Ilan Tal
Error: User Rate Limit Exceeded Ilan Tal

Похожие вопросы