小编典典

每次JSF ajax回发后执行JavaScript

ajax

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

我已执行以下操作以确保执行此每整页回发:

jQuery(document).ready(mahFunction);

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

我可能找不到有关此问题的信息,可能是因为我使用了不正确的术语。我曾经是ASP.NET开发人员,我将这些术语称为“整页回发”和“部分回发”,而其他JSF开发人员似乎不使用这些术语。


阅读 392

收藏
2020-07-26

共1个答案

小编典典

您可以通过以下方式将其注册为JSF
ajax回调处理程序jsf.ajax.addOnEvent

<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中进行了描述(单击“
评估” 链接)。这是相关的摘录:

表14-4 事件数据有效负载

    名称说明/值
    ------------- -----------------------------------------------------

    输入“事件”
    状态表14-3中指定的事件之一
    source触发Ajax请求的DOM元素。
    responseCode Ajax请求对象“状态”(XMLHttpRequest.status);
                   对于“开始”事件不存在;
    responseXML XML响应(XMLHttpRequest.responseXML);
                   对于“开始”事件不存在;
    responseText文本响应(XMLHttpResponse.responseTxt);
                   对于“开始”事件不存在;

作为一种替代方法,一种XHTML声明性的方法是将脚本调用仅嵌入到带有的JSF组件中,id然后让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();" />

请参阅所用组件库的文档。

2020-07-26