jsf.ajax.addOnEvent只有在我明确包含javax.faces时才有效:jsf.js

时间:2015-07-02 07:40:39

标签: javascript jsf jsf-2.2

我在头标记中使用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。

1 个答案:

答案 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加载事件之前执行。