我有一个包含行的表格样式页面。每行都有一个复选框。我可以选择所有/多个复选框,然后单击“提交”,每个行的Jquery ajax调用是什么。
基本上我每行有一个表单,我遍历所有已检查的行并提交执行jquery ajax调用的表单。
所以我有一个按钮:
$("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>
此表单提交到processRow:
function processRow(rowNum)
{
var Amount = $('#XAmt'+rowNum).val();
var XId = $('#XId'+rowNum).val();
var XNum = $('#OrderNumber'+rowNum).val();
var queryString = "xAmt=" + "1.00" + "&xNumber=" + OrdNum + "&xId=" + xId;
$('#coda_'+rowNum).removeClass("loader");
$('#coda_'+rowNum).addClass("loading");
$.ajax({
url: "x.asp",
cache: false,
type: "POST",
data: queryString,
success: function(html){
$('#result_'+rowNum).empty().append(html);
$('#coda_'+rowNum).removeClass("loading");
$('#coda_'+rowNum).addClass("loader");
}
});
}
我想知道的是,有一种方法可以告诉我所有的Ajax调用是否完整。原因是想要在所有这些调用发生时启用/禁用提交按钮。
谢谢,请注意,由于应用程序的敏感性,我不得不修改我的变量名称,因此很多可能会重复。
答案 0 :(得分:129)
最简单的方法是使用.ajaxStop()
event handler:
$(document).ajaxStop(function() {
// place code to be executed on completion of last outstanding ajax call here
});
您也可以手动检测是否有任何ajax调用仍处于活动状态:
创建一个包含多个活动Ajax连接的变量:
var activeAjaxConnections = 0;
在打开新的Ajax连接之前增加该变量
$.ajax({
beforeSend: function(xhr) {
activeAjaxConnections++;
},
url (...)
success
部分中的检查该变量是否等于零(如果是,则最后一次连接已完成)
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
}
}
正如您所看到的,我还添加了检查返回错误
答案 1 :(得分:23)
一个简洁的解决方案是使用;
$("body").ajaxStop(function() {
//Your code
});
有关更多信息,请查看http://api.jquery.com/ajaxStop/
上的jQuery .ajaxStop函数答案 2 :(得分:13)
也许:
jQuery.active == 0
被盗:
http://artsy.github.com/blog/2012/02/03/reliably-testing-asynchronous-ui-w-slash-rspec-and-capybara/
有关StackOverflow的更多信息:
答案 3 :(得分:-2)
如果只是简单地使用 if ?
success: function(html){
if(html.success == true ){
$('#result_'+rowNum).empty().append(html);
$('#coda_'+rowNum).removeClass("loading");
$('#coda_'+rowNum).addClass("loader");
}
}