JSF 2.2:输出" jsf.js"和" omnifaces.js"手动到身体而不是头部

时间:2017-06-15 17:57:13

标签: jsf jsf-2.2 omnifaces

我的jsf-project中javascript资源的加载顺序有问题。在我的主模板中,我加载了页面底部的所有脚本:

<h:body>

    ...

    <ui:insert name="scripts">          
        <h:outputScript name="js/jquery.js" />
        <h:outputScript name="js/chart.js" />
        <h:outputScript name="js/all.js"  />
    </ui:insert>
</h:body>

在某些页面上我使用omnifaces commandscript-tag和all.js中定义的javascript函数:

 <o:commandScript name="ALL.selectTypes" action="#{bean.typeSelected}">

我得到了

ReferenceError: ALL is not defined

原因是,在加载jsf.js和omnifaces.js时,all.js尚未加载,因为两个脚本都出现在文档的头部,而我自己的脚本出现在底部。当我把我的脚本放在

<h:head>

而是在页面底部,它按预期工作。我可以手动控制这些脚本的外观,使它们看起来像:

<h:body>

    ...

    <ui:insert name="scripts">      

        <h:outputScript library="javax.faces" name="jsf.js"  />
        <h:outputScript library="omnifaces" name="omnifaces.js"  />

        <h:outputScript name="js/jquery.js" />
        <h:outputScript name="js/chart.js" />
        <h:outputScript name="js/all.js"  />
    </ui:insert>
</h:body>

上述尝试没有任何效果。无论如何,jsf.js和omnifaces.js都放在头部。我也尝试过替换

 <h:outputScript> 

 <o:deferredScript>

但无法成功。还有其他选择吗?提前感谢提示。

1 个答案:

答案 0 :(得分:1)

您最好在头部或者在头部加载的通用脚本中声明ALL命名空间。

<h:head>
    ...
    <script>var ALL = {};</script>
</h:head>

并确保all.js本身并不会被另一个var ALL = {}覆盖。

var ALL = ALL || {};