2012-05-24 75 views
1

在之前的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上給出的以前的解決方案。很可能是因爲我不能做我想要做的事情,但如果確實如此,我想要確認。

感謝, 宜蘭

回答

4

無法更新標題由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請求中重新執行。

+0

感謝您的回答。我不知道HTML語法的非法檢查。我試了一下,得到了62個錯誤。它收集了與primefaces相關的所有特殊輸入,並將它們全部標記爲非法。有了所有的誤報,就很難看到真正的問題。 –

+0

我嘗試了你的建議,顯然它工作。如果我可以問,我想多一點。對於許多頁面,我希望稍微多於名稱,即名稱+他正在使用哪個頁面的某種建議。爲了得到我要麼必須到我的或獲取什麼是當前頁面名稱的值。 –

相關問題