繁体   English   中英

每次JSF ajax回发后执行JavaScript

[英]Execute JavaScript after every JSF ajax postback

我有一个javascript函数,我希望在JSF 2中的每个异步回发后执行。

我已完成以下操作以确保执行每个完整页面的回发:

jQuery(document).ready(mahFunction);

我需要这样做的原因是解决第三方JSF组件库中的故障,因此我无法修改服务器呈现阶段中的任何内容来为组件执行此操作。

我很难找到有关这方面的信息,因为我使用了错误的条款。 我曾经是一名ASP.NET开发人员,我将这些术语称为“整页回发”和“部分回发”,似乎其他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事件数据有效负载

\n     名称描述/价值\n     ------------- ------------------------------------- ---------------\n     输入“事件”\n     status表14-3中指定的事件之一\n     source触发Ajax请求的DOM元素。\n     responseCode Ajax请求对象'status'(XMLHttpRequest.status); \n                    不属于“开始”事件;\n     responseXML XML响应(XMLHttpRequest.responseXML); \n                    不属于“开始”事件;\n     responseText文本响应(XMLHttpResponse.responseTxt);\n                    不属于“开始”事件;\n

作为替代方案,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();" />

请参阅您正在使用的组件库的文档。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM