表单重新提交后如何重新执行javascript函数?

表单重新提交后如何重新执行javascript函数?,javascript,jsf,rerender,Javascript,Jsf,Rerender,我需要在表单重新呈现之后重新执行javascript。简单地说,在XHTML内容之后加入javascript不会有帮助,因为这是一个部分请求。另外,我不能使用“onComplete”,因为我正在重新呈现表单的commandButton在JSF组件中有好几个地方使用。我需要在本地进行修复 有办法吗?我想知道在这种情况下f:ajax是否会有所帮助 如果有人对此有任何线索,请告诉我。您可以将jQuery添加到应用程序中,并执行以下操作: $(#yourComponentId).load(functio

我需要在表单重新呈现之后重新执行javascript。简单地说,在XHTML内容之后加入javascript不会有帮助,因为这是一个部分请求。另外,我不能使用“onComplete”,因为我正在重新呈现表单的commandButton在JSF组件中有好几个地方使用。我需要在本地进行修复

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


如果有人对此有任何线索,请告诉我。

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

$(#yourComponentId).load(function(){
   //execute javascript.
});
你可以看看这里

乐:那是开着的

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

ofc.

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

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

您可以通过
jsf.ajax.addOnEvent()
添加一个全局钩子,这样,如果功能需求适用于每个ajax请求,则无需在
的每个
onevent
属性中指定它

jsf.ajax.addOnEvent(handleAjax);
另一种方法是使用,它提供的正好用于此目的。你可以随意把它放在头上

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

这会在视图上的每个ajax请求上自动重新执行,这样您就不需要在视图中的多个单独位置复制它,而这些位置可以进行ajax更新,或者在每个

中重复其父ID。如果您想使用JQuery/JS执行复杂操作,并且不特别关心

对于更复杂的JS,如果您决定使用全局事件处理程序,例如您使用JS将函数绑定到元素,这些函数将被重新绑定(因此执行两次),因此您需要某种方法来确定需要重新执行的内容

我最后做的是从事件回调中获取id,并只执行相关的JS/JQuery:

jsf.ajax.addOnEvent(ajaxCompleteProcess);


function ajaxCompleteProcess(data) {
    if (data.status && data.status === 'success') {
        var children1 = data.responseXML.children;
        for (i = 0; i < children1.length; i += 1) {
            var children2 = children1[i].children;
            for (j = 0; j < children2.length; j += 1) {
                var children3 = children2[j].children;
                for (y = 0; y < children3.length; y += 1) {
                    if (children3[y].id.indexOf('javax.faces.ViewState') != -1)
                        continue;
                    elementProcess(('#' + children3[y].id.replace(/\:/g, '\\:')));
                }
            }
        }
    }
}
jsf.ajax.addOnEvent(ajaxCompleteProcess);
函数ajaxCompleteProcess(数据){
if(data.status&&data.status==='success'){
var children1=data.responseXML.children;
对于(i=0;i

注意:这些丑陋的
for
循环可能不是必需的(您可以使用clildren[0]),但我还没有找到时间来检查规范。

这不起作用。这只在DOM load/ready上执行,不会在ajax请求上重新执行。在document ready事件中,我们将钩住函数,该函数将在id=yourComponentId的每个组件触发“load”事件时执行。也许最好在组件的“就绪”事件时执行函数,但无论如何,我认为这会起作用。您认为BalusC怎么样?由于ajax响应,DOM操作不会调用DOM就绪事件。谢谢BalusC!这似乎是一个简单而直接的方法。它成功了。只需输入h:outputScript就可以帮助我删除所有未完成的操作:)非常优雅的解决方案@Balusc当我将JS函数放入h:outputScript时,它会执行,但它会从It脚本使用的其他脚本中抛出错误,例如$(…)。datetimepicker不是一个函数。如果知道投票失败的原因,我会很高兴。这是可行的,您只需要为整个应用程序编写一段代码。所以,这不是一个坏帖子,就是因为某种原因而有坏帖子。-谢谢
<h:onloadScript>someFunction();</h:onloadScript>
jsf.ajax.addOnEvent(ajaxCompleteProcess);


function ajaxCompleteProcess(data) {
    if (data.status && data.status === 'success') {
        var children1 = data.responseXML.children;
        for (i = 0; i < children1.length; i += 1) {
            var children2 = children1[i].children;
            for (j = 0; j < children2.length; j += 1) {
                var children3 = children2[j].children;
                for (y = 0; y < children3.length; y += 1) {
                    if (children3[y].id.indexOf('javax.faces.ViewState') != -1)
                        continue;
                    elementProcess(('#' + children3[y].id.replace(/\:/g, '\\:')));
                }
            }
        }
    }
}