Ila*_*Tal 1 ajax jsf primefaces
在上一个问题中,我询问了有关更新菜单栏的问题。BalusC 告诉我,我需要添加包含菜单栏的表单。
我想扩展这个问题,问我是否可以更新标题中的文字。正在使用模板,我使用以下方式填写值
<ui:define name="AreaTitle">
#{viewBacking.current.firstName} #{viewBacking.current.surName}
</ui:define>
Run Code Online (Sandbox Code Playgroud)
模板有
<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>
Run Code Online (Sandbox Code Playgroud)
在标头中定义表单似乎很奇怪,因此没有定义任何表单。我在 viewBacking.current 中放置了一个断点,这样我就可以看到它何时使用它。即使我点击刷新来重新显示表单,它也不会再次遇到断点。只有当我转到具有不同内容的不同页面时,它才会再次遇到断点。刷新的是
public void refreshForm() {
RequestContext context = RequestContext.getCurrentInstance();
context.update("menuForm:masterMenuBar");
context.update("AreaTitle");
}
Run Code Online (Sandbox Code Playgroud)
这显示了 BalusC 在 masterMenuBar 上给我的先前解决方案。我很可能无法完成我要求做的事情,但如果是这种情况,我想确认一下。
谢谢,伊兰
您无法通过 JSF ajax 更新来更新标题,因为<title>
它不是 JSF 组件。您也不能将 HTML 或 JSF 组件放入 中<title>
,这是非法的HTML 语法。
最好的选择是使用 JavaScript 来更新标题,将其分配给document.title
. 您可以用于RequestContext#execute()
此用途。
String fullName = current.getFirstName() + " " + current.getSurName();
context.execute("document.title='" + fullName + "'");
Run Code Online (Sandbox Code Playgroud)
由于这似乎是用户控制的数据,因此我会使用StringEscapeUtils#escapeJavaScript()
对其进行转义以防止潜在的XSS 攻击漏洞。
String fullName = current.getFirstName() + " " + current.getSurName();
context.execute("document.title='" + StringEscapeUtils.escapeJavaScript(fullName) + "'");
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用OmniFaces <o:onloadScript>
。
<o:onloadScript>document.title='#{of:escapeJS(viewBacking.current.firstName)} #{of:escapeJS(viewBacking.current.surName)}'</o:onloadScript>
Run Code Online (Sandbox Code Playgroud)
这将在每个 ajax 请求时重新执行。
归档时间: |
|
查看次数: |
775 次 |
最近记录: |