我的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>
但无法成功。还有其他选择吗?提前感谢提示。
答案 0 :(得分:1)
您最好在头部或者在头部加载的通用脚本中声明ALL
命名空间。
<h:head>
...
<script>var ALL = {};</script>
</h:head>
并确保all.js
本身并不会被另一个var ALL = {}
覆盖。
var ALL = ALL || {};