jQuery , отличный javascript-фреймворк для манипулирования DOM и выполнения вызовов ajax, предоставляет две замечательные возможности для определения времени выполнения вызовов ajax:
$.ajaxStart()
и $.ajaxStop()
Обе эти ловушки принимают функцию-обработчик, которая будет вызываться, когда собирается начать вызов ajax, и когда все вызовы ajax прекратились, соответственно.Эти функции могут быть связаны с любым элементом на странице.Вы можете установить глобальное логическое значение в вашем обработчике $.ajaxStart()
на true и установить его обратно в false в вашем обработчике $.ajaxStop()
.
Затем вы можете проверить этот логический флаг и определить, выполняются ли вызовы AJAX.
Что-то вроде этого:
$(document).ajaxStart(function() {
window.ajaxBusy = true;
});
$(document).ajaxStop(function() {
window.ajaxBusy = false;
});
Что касается определения, когда браузер работаетзагружая текущую страницу, вы можете проверить document.readyState
.Он возвращает строку "loading"
во время загрузки документа и строку "complete"
после загрузки.Вы можете привязать обработчик к document.onreadystatechange
и установить глобальное логическое значение, которое будет указывать, загружается ли документ по-прежнему.
Примерно так:
document.onreadystatechange = function() {
switch (document.readyState) {
case "loading":
window.documentLoading = true;
break;
case "complete":
window.documentLoading = false;
break;
default:
window.documentLoading = false;
}
}
РЕДАКТИРОВАТЬ:
Похоже, что $.ajaxStart()
и $.ajaxStop()
НЕ работают для вызовов ajax, вызываемых без jQuery.Все объекты XMLhttprequest имеют событие readystatechange
, к которому вы можете прикрепить обработчик.Вы можете использовать эту функцию, чтобы определить, выполняется ли этот отдельный вызов.Вы можете поместить все ссылки на ожидающие вызовы в массив и проверить setInterval()
длину этого массива.Если оно> 1, то существуют ajax-вызовы.Это грубый подход, и только один способ справиться с этим.Возможно, есть и другие способы сделать это.Но вот общий подход:
// declare array to hold references to outstanding requets
window.orequets = [];
var req = XMLHttpRequest();
// open the request and send it here....
// then attach a handler to `onreadystatechange`
req.onreadystatechange = function() {
if (req.readyState != 4 || req.readyState != 3) {
// req is still in progress
orequests.push(req);
window.reqPos = orequests.length -1
} else {
window.orequests = orequests.slice(reqPos, reqPos + 1);
}
}
Выполните вышеуказанное для каждой XMLHttpRequest()
, которую вы будете отправлять, конечно же, изменив имя запроса для каждого.Затем запустите setInterval()
, который запускается каждые x миллисекунд, и проверяет свойство длины orequests
.Если оно равно нулю, никаких запросов не происходит, если оно больше нуля, запросы все еще происходят.Если никаких запросов не происходит, вы можете либо очистить интервал через clearInterval()
, либо оставить его включенным.
Ваш setInterval может выглядеть примерно так:
var ajaxInterval = setInterval(function() {
if (orequests.length > 0) {
// ajax calls are in progress
window.xttpBusy = true;
} else {
// ajax calls have ceased
window.xttpBusy = false;
// you could call clearInterval(ajaxInterval) here but I don't know if that's your intention
},
3000 // run every 3 seconds. (You can decide how often you want to run it)
});