JSF 2.2:手动输出 "jsf.js" 和 "omnifaces.js" 到 body 而不是 head
JSF 2.2: output "jsf.js" and "omnifaces.js" manually to body instead of head
我的 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 命令脚本标签和 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>
但是没能做到。还有其他选择吗?提前感谢您的提示。
您最好在 head 中声明 ALL
名称空间,或者在 head 中加载的通用脚本中声明。
<h:head>
...
<script>var ALL = {};</script>
</h:head>
并确保 all.js
本身不会被另一个 var ALL = {}
覆盖。
var ALL = ALL || {};
我的 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 命令脚本标签和 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>
但是没能做到。还有其他选择吗?提前感谢您的提示。
您最好在 head 中声明 ALL
名称空间,或者在 head 中加载的通用脚本中声明。
<h:head>
...
<script>var ALL = {};</script>
</h:head>
并确保 all.js
本身不会被另一个 var ALL = {}
覆盖。
var ALL = ALL || {};