一尘不染

我可以更新标题栏吗?

ajax

在上一个问题中,我问过有关更新菜单栏的问题。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上给我的先前解决方案。很可能我无法完成我要求做的事情,但是我想确认是否是这种情况。

谢谢


阅读 208

收藏
2020-07-26

共1个答案

一尘不染

您不能仅仅通过JSFajax更新来更新标题,因为<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请求上重新执行。

2020-07-26