我可以更新标题栏吗?
问题描述:
在之前的question中,我询问了有关更新菜单栏的问题。 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上给出的以前的解决方案。很可能是因为我不能做我想要做的事情,但如果确实如此,我想要确认。
感谢, 宜兰
答
无法更新标题由JSF ajax的更新,只是因为<title>
不是一个JSF组件。您也不能将HTML或JSF组件放入<title>
,这是illegal HTML语法。
最好的办法是用JavaScript代替document.title
来更新标题。您可以使用RequestContext#execute()
。
String fullName = current.getFirstName() + " " + current.getSurName();
context.execute("document.title='" + fullName + "'");
由于这似乎是用户控制的数据,我会用StringEscapeUtils#escapeJavaScript()
逃避它,以防止潜在的XSS attack holes。
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请求中重新执行。
感谢您的回答。我不知道HTML语法的非法检查。我试了一下,得到了62个错误。它收集了与primefaces相关的所有特殊输入,并将它们全部标记为非法。有了所有的误报,就很难看到真正的问题。 –
我尝试了你的建议,显然它工作。如果我可以问,我想多一点。对于许多页面,我希望稍微多于名称,即名称+他正在使用哪个页面的某种建议。为了得到我要么必须到我的或获取什么是当前页面名称的值。 –