Как узнать, когда все вызовы ajax завершены
у меня есть страница стиля таблицы со строками. Каждая строка имеет флажок. Я могу выбрать все / многие флажки и нажать "Отправить", и то, что делает, - это вызов 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 завершены. Причина в том, что вы хотите включить/отключить кнопку отправки, пока все эти вызовы происходят.
спасибо и обратите внимание, что мне пришлось корежить мои имена переменных из-за чувствительности приложения, поэтому многие из них могут быть продублированы.
4 ответа:
легкий путь
самый простой способ-использовать
.ajaxStop()
обработчик события:$(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 } }
как вы можете видеть, я добавил также проверку на возврат с ошибкой
аккуратное решение было бы использовать;
$("body").ajaxStop(function() { //Your code });
для получения дополнительной информации проверьте jQuery .функция ajaxStop при http://api.jquery.com/ajaxStop/
может быть:
jQuery.active == 0
украли из:
http://artsy.github.com/blog/2012/02/03/reliably-testing-asynchronous-ui-w-slash-rspec-and-capybara/
дополнительная информация о StackOverflow: