Jquery 如何知道所有ajax调用何时完成

Jquery 如何知道所有ajax调用何时完成,jquery,ajax,Jquery,Ajax,我有一个带有行的表格样式页面。每行都有一个复选框。我可以选择所有/多个复选框并单击“提交”,is为每一行调用jQueryAjax 基本上,我为每一行都有一个表单,我迭代所有选中的行并提交执行jqueryajax调用的表单 所以我有一个按钮,可以: $("input:checked").parent("form").submit(); 那么每行都有: <form name="MyForm<%=i%>" action="javascript:

我有一个带有行的表格样式页面。每行都有一个复选框。我可以选择所有/多个复选框并单击“提交”,is为每一行调用jQueryAjax

基本上,我为每一行都有一个表单,我迭代所有选中的行并提交执行jqueryajax调用的表单

所以我有一个按钮,可以:

       $("input:checked").parent("form").submit();
那么每行都有:

            <form name="MyForm<%=i%>" action="javascript:processRow(<%=i%>)" method="post" style="margin:0px;">
                <input type="checkbox" name="X" value="XChecked"/>
                <input type="hidden" id="XNumber<%=i%>" name="X<%=i%>" value="<%=XNumber%>"/>
                <input type="hidden" id="XId<%=i%>" name="XId<%=i%>" value="<%=XNumber%>"/>
                <input type="hidden" id="XAmt<%=i%>" name="XAmt<%=i%>" value="<%=XAmount%>"/>
                <input type="hidden" name="X" value="rXChecked"/>
            </form>
我想知道的是,从这里我可以知道我所有的Ajax调用是否都完成了。原因是希望在所有这些调用发生时启用/禁用提交按钮

谢谢,请注意,由于应用程序的敏感性,我不得不修改变量名,因此许多变量名可能会重复。

简单的方法 最简单的方法是使用:

艰难的道路 您还可以手动检测任何ajax调用是否仍处于活动状态:

创建一个包含活动Ajax连接数的变量:

在打开新的Ajax连接之前,增加该变量

success
部分检查该变量是否等于零(如果是,则最后一次连接已完成)


如您所见,我还添加了检查返回错误的功能,一个简单的解决方案是使用

$("body").ajaxStop(function() {
    //Your code
});
有关更多信息,请查看jQuery.ajaxStop函数,网址为:

jQuery.active == 0
被盗自:

有关StackOverflow的更多信息:


如果,直接使用怎么样

success: function(html){
   if(html.success == true ){
            $('#result_'+rowNum).empty().append(html);
            $('#coda_'+rowNum).removeClass("loading");
            $('#coda_'+rowNum).addClass("loader");

          }
   }

如何在触发ajaxStop处理程序后再次删除它?关于“困难的方法”:没有必要保留变量,Jquery已经这样做了:$。active保留当前活动的ajax调用数Note beforesend应该beforesend有没有办法确定它是哪个ajax调用,如果同时有多行?虽然检测所有ajax调用何时完成对任何设计都有价值,但我认为更好的总体解决方案是一次提交多行。在某些方面,将每一行作为单独的ajax帖子发送对系统来说是非常困难的,而且(在我看来)不是最好的设计。我甚至会说,我保证有一天,如果你坚持每行一个ajax调用的设计,你会后悔的。除了@ErikE指出的设计问题,我很惊讶没有人提到使用承诺来回答最初的问题。
$.ajax({
  beforeSend: function(xhr) {
    activeAjaxConnections++;
  },
  url (...)
success: function(html){
  activeAjaxConnections--;
  $('#result_'+rowNum).empty().append(html);
  $('#coda_'+rowNum).removeClass("loading");
  $('#coda_'+rowNum).addClass("loader");
  if (0 == activeAjaxConnections) {
    // this was the last Ajax connection, do the thing
  }
},
error: function(xhr, errDesc, exception) {
  activeAjaxConnections--;
  if (0 == activeAjaxConnections) {
    // this was the last Ajax connection, do the thing
  }
}
$("body").ajaxStop(function() {
    //Your code
});
jQuery.active == 0
success: function(html){
   if(html.success == true ){
            $('#result_'+rowNum).empty().append(html);
            $('#coda_'+rowNum).removeClass("loading");
            $('#coda_'+rowNum).addClass("loader");

          }
   }