我有一个javascript函数,我想在JSF 2中的每次异步回发后执行。
我做了以下操作来确保每次整页回发都执行:
jQuery(document).ready(mahFunction);
我需要这样做的原因是为了解决第三方JSF组件库中的一个小故障,因此我无法在服务器呈现阶段修改任何内容来为组件执行此操作。
我很难找到这方面的信息,可能是因为我使用了不正确的术语。我以前是ASP。NET开发人员和我将这些术语称为"完整页面回发"one_answers"部分回发",而其他JSF开发人员似乎不使用这些术语。
您可以通过jsf.ajax.addOnEvent
将其注册为JSF ajax回调处理程序:
<script>
jsf.ajax.addOnEvent(foo);
</script>
<script>
function foo(data) {
var ajaxStatus = data.status; // Can be "begin", "complete" and "success".
switch (ajaxStatus) {
case "begin": // Right before sending ajax request.
// ...
break;
case "complete": // Right after receiving ajax response.
// ...
break;
case "success": // When ajax response is successfully processed.
// ...
break;
}
}
</script>
,其中data
对象有几个有用的XHR派生属性,这些属性在JSF 2.0规范的表14-4中描述(单击For Evaluation链接)。以下是相关内容的摘录:
表14-4事件数据负载
<>之前的名字 描述/值------------- ----------------------------------------------------类型 " 事件"status表14-3中指定的事件之一source触发Ajax请求的DOM元素。Ajax请求对象'状态' (XMLHttpRequest.status);"begin"事件不存在;XMLHttpRequest.responseXML);"begin"事件不存在;responseText文本响应(xmlhttpresponse . responseText);"begin"事件不存在;之前
作为一种替代方法,一种xhtml声明式的方法是将脚本调用嵌入到一个带有id
的JSF组件中,并让ajax调用重新呈现它。组件应该依次根据FacesContext#isPostback()
有条件地呈现脚本。
<h:form>
<h:commandButton value="Submit" action="#{bean.submit}">
<f:ajax render=":myscript">
</h:commandButton>
</h:form>
<h:panelGroup id="myscript">
<h:outputScript rendered="#{facesContext.postback}">foo();</h:outputScript>
</h:panelGroup>
然而,大多数组件库对此都有更好的抽象支持。由于您没有提及您正在使用的是哪一个,因此可以给出更合适的答案,这里只是一个基于PrimeFaces命令按钮的随机示例。
<p:commandButton value="Submit" action="#{bean.submit}" oncomplete="foo();" />
请参考您正在使用的组件库的文档。
参见:
- 如何重新执行javascript函数后的形式渲染?