2011-10-02 160 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。