将JS文件包含在使用ui:include包含的xhtml文件中

Ben*_*Ben 5 javascript jsf jsf-2

我将用一个例子说明我的问题:

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 可以js像我一样在内部文件中声明文件吗?
  2. 我是否需要(并且我应该jquery-1.6.2.js)在内部文件中再次声明common()?
  3. 如果我inner_panel使用AJAX 取消渲染和重新渲染会发生什么?是否会重新加载内部包含的标题?

Bal*_*usC 13

可以像我一样在内部文件中声明js文件吗?

不.您也不应该<h:head>在包含中指定.这只会导致HTML 无效.正如您现在所知,将导致:

<html>
  <head>
    <script></script>
  </head>
  <body>
    <head>
      <script></script>
    </head>
    <body>
    </body>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

(在浏览器中右键单击页面并查看源代码以自行查看,如有必要,请进行W3验证)

相应修复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>
Run Code Online (Sandbox Code Playgroud)

这将产生有效的HTML.声明的脚本<h:outputScript target="head"><head>自动结束,如果之前尚未声明的话.与在真实HTML中一样,应该只有一个 <h:head>,<h:body>在整个视图中,包括任何模板和包含文件.


我是否需要(并且我应该)在内部文件中再次声明公共(jquery-1.6.2.js)?

如果父文件已将其声明为,则不会<h:outputScript>.但是在包含中重新声明它并不会造成伤害.如果之前已经宣布过,它将不会重复.


如果我inner_panel使用Ajax 取消渲染并重新渲染会发生什么?是否会重新加载内部包含的标题?

这仅在您不使用时有效target="head".它们是否将从服务器重新加载,取决于浏览器之前是否已经请求它并且已经存在并且在浏览器缓存中有效.但基本上,浏览器会再次被告知加载它,是的.使用Firebug,您可以轻松确定它.