我在头标记中使用JSF 2.2.4以及以下内容:
<h:outputScript library="javax.faces" name="jsf.js" />
后来我发现以下帖子并删除了上面的代码,因为它会自动包含在内: renaming jsf.js.jsf to jsf.js.xhtml
当我检查时发现它是自动包含的,但我们收到错误的脚本放在常见模板的头部。错误是脚本将对象jsf 作为 undefined 。此脚本的目的是显示所有JSF AJAX调用的公共加载器。脚本如下:
//To display loading indicator for all JSF f:ajax calls.
jsf.ajax.addOnEvent(function(data) {
var ajaxstatus = data.status; // Can be "begin", "complete" and "success"
switch (ajaxstatus) {
case "begin": // This is called right before ajax request is been sent.
wizShowAjaxLoader();
break;
case "complete": // This is called right after ajax response is received.
wizHideAjaxLoader();
break;
case "success": // This is called when ajax response is successfully processed.
// NOOP.
break;
}
});
我想知道为什么它在我明确包含jsf.js时有效。当我删除它时,脚本显示jsf对象为undefined。
答案 0 :(得分:1)
您需要确保在 javax.faces:jsf.js
被包含之后调用您的脚本,原因很简单jsf
仅在javax.faces:jsf.js
中定义{ {1}}已包含(并已执行)。
简而言之,您需要确保JavaScript代码流如下所示:
var jsf = ...;
...
jsf.ajax.addOnEvent(...);
因此不喜欢这样:
jsf.ajax.addOnEvent(...);
...
var jsf = ...;
确保这一点的一种方法是将<h:outputScript>
中的脚本包含在<h:body>
中,并将target
设置为head
。
<h:head>
...
</h:head>
<h:body>
<h:outputScript name="yourscript.js" target="head" />
...
</h:body>
JSF将确保在自动包含的脚本之后以HTML头结束。
另一种方法是将其保留在<h:head>
中,但将target
设置为body
。
<h:head>
...
<h:outputScript name="yourscript.js" target="body" />
</h:head>
JSF将确保它最终位于HTML正文的最后,因此它基本上在DOM加载事件之前执行。