如何在表单reRender之后重新执行javascript函数?

时间:2012-10-26 05:18:45

标签: javascript jsf rerender

我需要在表单重新呈现后重新执行javascript。简单地说,在XHTML内容之后放入javascript将无法帮助,因为它是部分请求。另外,我不能使用“onComplete”作为我重新渲染表单的commandButton是在几个地方使用的JSF组件。我需要在本地获得修复。

有什么办法吗?我想知道f:ajax在这种情况下是否会有所帮助。

如果有人对此有任何疑问,请告诉我。

2 个答案:

答案 0 :(得分:38)

最简单的方法是将JS函数调用放入要更新的组件本身。

<h:form>
    ...
    <h:commandButton value="submit"><f:ajax render="@form" /></h:commandButton>
    <h:outputScript>someFunction();</h:outputScript>
</h:form>

这种方式在页面加载时执行,如果表单由ajax更新。

对于<f:ajax>本身,您还可以使用其onevent属性。

<f:ajax ... onevent="handleAjax" />

function handleAjax(data) {
    var status = data.status;

    switch(status) {
        case "begin":
            // This is invoked right before ajax request is sent.
            break;

        case "complete":
            // This is invoked right after ajax response is returned.
            break;

        case "success":
            // This is invoked right after successful processing of ajax response and update of HTML DOM.
            someFunction();
            break;
    }
}

您可以按jsf.ajax.addOnEvent()添加全局挂钩,这样如果功能要求适用于每个ajax请求,则无需在onevent的每个<f:ajax>属性中指定它。

jsf.ajax.addOnEvent(handleAjax);

另一种方法是使用提供OmniFaces JSF utility library<h:onloadScript>来实现此目的。您可以根据需要将其放在头部。

<h:onloadScript>someFunction();</h:onloadScript>

这会自动在视图上的每个ajax请求中重新执行,这样您就不需要将其复制到视图中可以进行ajax更新的多个单独位置,或者在每个{重复{%}中重复其父ID {1}}。

答案 1 :(得分:-1)

您可以将jQuery添加到您的应用程序中,并执行以下操作:

$(#yourComponentId).load(function(){
   //execute javascript.
});

您可以在此处查看http://api.jquery.com/load/

LE:正在

$(document).ready(function(){
}

OFC。