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



我的JSF项目中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中定义的JavaScript-function.js:

 <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>

但做不到。 还有其他选择吗? 提前感谢您的提示。

你最好在 head 中声明ALL命名空间,或者在 head 中加载的通用脚本中声明命名空间。

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

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

var ALL = ALL || {};

最新更新