2011-10-02 161 views
5

我會用一個例子ilustrate我的問題:包括在使用界面包含一個XHTML文件JS文件:包括

outerfile.xhtml:

<h:head> 
    <h:outputScript library="js" name="jquery-1.6.2.js" /> 
    <h:outputScript library="js" name="outer.js" /> 
</h:head> 

<h:body> 
    <h:panelGroup id="inner_panel"> 
     <ui:include src="innerfile.xhtml" /> 
    </h:panelGroup> 
</h:body> 

innerfile.xhtml:

<ui:composition ... > 
    <h:head> 
     <h:outputScript library="js" name="jquery-1.6.2.js" /> 
     <h:outputScript library="js" name="inner.js" /> 
    </h:head> 

    <h:body> 
     <h:panelGroup> 
      I Am Text in The Inner File! 
     </h:panelGroup> 
    </h:body> 
</ui:composition> 

我的問題:

  1. 是否可以dec按照我的方式在內部文件中添加js文件?
  2. 我是否需要(而且應該)在內部文件中再次聲明通用(jquery-1.6.2.js)?
  3. 如果我使用AJAX解除渲染並重新渲染inner_panel,會發生什麼?內置頭文件是否會重新加載?

回答

12

是不是好申報內部文件中的js文件我做的方法是什麼?

不可以。您不應在include中指定<h:head>。這隻會導致無效 HTML。正如你現在所擁有的將導致:

<html> 
    <head> 
    <script></script> 
    </head> 
    <body> 
    <head> 
     <script></script> 
    </head> 
    <body> 
    </body> 
    </body> 
</html> 

(右擊頁面在瀏覽器和做查看源代碼自己看看吧,w3-validate如果需要的話)相應

修復它innerfile.xhtml

<ui:composition ... > 
    <h:outputScript library="js" name="jquery-1.6.2.js" target="head" /> 
    <h:outputScript library="js" name="inner.js" target="head" /> 

    <h:panelGroup> 
     I Am Text in The Inner File! 
    </h:panelGroup> 
</ui:composition> 

這將導致有效的HTML。 <h:outputScript target="head">宣佈的腳本將自動結束於<head>(如果尚未聲明)。與在真實的HTML中一樣,在整個視圖中應該只有一個一個<h:head><h:body>,包括任何模板和包含文件。


我需要(也應該I)內部文件中再次聲明常見(jQuery的1.6.2.js)?

如果父文件已將其聲明爲<h:outputScript>,則不應該如此。但在包含中重新聲明它並不會造成傷害。無論如何,如果它已經被宣佈過,它將不會被複制。


如果我未呈現和使用Ajax的重新渲染inner_panel會發生什麼?內置頭文件是否會重新加載?

這隻適用於如果你不使用target="head"。它們是否會從服務器重新加載,取決於它之前是否已經被瀏覽器請求,並且已經存在並且在瀏覽器緩存中有效。但基本上,瀏覽器會再次被告知加載它,是的。藉助Firebug,您可以輕鬆確定它。

+0

Tnx。小跟進 - 根據你的回答,如果我加載頁面時,內部頁面沒有呈現,然後呈現內頁面,內部的js文件將會丟失。對? – Ben

+0

我沒說過。他們將被包括在內。瀏覽器將被告知加載它們。但是,無論是從瀏覽器緩存中獲取還是從服務器獲取,都取決於JS響應中的標題,以及它是否已經存在於瀏覽器緩存中。如果它是可緩存的並存在於瀏覽器緩存中,那麼它將不會被重新加載(因爲瀏覽器已經擁有它)。否則,它確實會從服務器重新加載。 – BalusC

+0

我明白你的意思了,我澄清了重新渲染部分。 – BalusC

1

把它寫正確的方法是使用target =「頭」您的H內部:在innerfile.xhtml outputScript聲明:

<ui:composition ... > 
    <h:outputScript library="js" target="head" name="jquery-1.6.2.js" /> 
    <h:outputScript library="js" target="head" name="inner.js" /> 
    <h:panelGroup> 
     I Am Text in The Inner File! 
    </h:panelGroup> 
</ui:composition> 

這樣一來所有的資源聲明將外內放。具有相同庫/資源名稱的同一資源的多個聲明將不會多次呈現相同的聲明,因爲h:outputScript的呈現器具有一些代碼,用於檢測並忽略重複的條目。注意事情是不同的,如果你渲染一個沒有引用JavaScript文件的h:outputScript。