Есть ли способ с JQUERY или Javascript для обнаружения в любое время, когда окно браузера загружает что-то, делая вызов ajax, загружая изображение и т. Д. В принципе, любая сетевая активность?JQUERY или JS есть способ обнаружить в любое время, когда окно загружается? В принципе, любая сетевая активность?
ответ
Мой ответ ниже и ответы предыдущих пользователей только пытаются проверить, в настоящее время браузер выполняет запрос XmlHttpRequest (т. Е. Ajaxy). Вы спросили, можете ли вы сказать, выполнял ли браузер какой-либо сетевой запрос (т. Е. Загрузка изображений/css или, возможно, длинный запрос кометы). Я не знаю ни одного javascript API, который бы сказал вам это - они могут существовать, но я подозреваю, что если они это сделают, они будут специфичны для браузера [если кто-нибудь знает ответ на этот чип в]. Очевидно, что такие инструменты, как Firebug и dynaTrace, могут обнаруживать сетевую активность, но я думаю, что этот инструмент «подключается» к браузеру намного глубже, чем код javascript.
Сказав все это, если вы хотите считать XHRs, порожденным jQuery, тогда ответ dave1010 кажется хорошим.
Однако я думаю, что он склонен к некоторым проблемам состояния гонки: -
Согласно документации (http://api.jquery.com/ajaxStart/)
Всякий раз, когда запрос Ajax собирается быть отправлено, JQuery проверяет, есть ли какие-либо другие выдающиеся запросы Ajax. Если ни один не выполняется, jQuery запускает событие ajaxStart. Любые и все обработчики, зарегистрированные в методе .ajaxStart(), выполняются в это время.
Итак, если был запущен XHR с длительным сроком службы, а еще один был запущен до завершения первого, обработчик ajaxStart будет вызываться только один раз. Второй XHR может завершиться до первого и установить loading = false
, хотя первый запрос все еще выполняется.
Глядя на источник jQuery 1.4, похоже, подтверждает это. Интересно, что в jQuery 1.4 есть счет активных XHR (jQuery.active), но это не упоминается в документах, поэтому, вероятно, лучше не использовать его (что очень жаль, потому что это облегчит жизнь).
См. http://gist.github.com/277432#LID5052 для кода, который проверяет, что $ .active равен 0 перед вызовом обработчиков ajaxStart.
[Я думаю] Глобальные обработчики событий «ajaxSend» вызывается перед каждым XHR. Использование этого в предпочтении «ajaxStart» должно помочь, но нам все равно нужно будет учитывать количество активных запросов, а не простой флаг «загрузка».
Возможно, что-то вроде следующего будет работать?
var activeXhrCount = 0;
$(document).ajaxSend(function() {activeXhrCount++;}).ajaxComplete(function(){activeXhrCount--;});
Имейте в виду, что это даст неправильные ответы, если любой код вызывает $ .ajax с глобальным параметром, установленным в ложь, и поэтому вряд ли пуленепробиваемые;
Также имейте в виду, что activeXhrCount учитывает только XHRs, порожденные jQuery - те из других библиотек, которые вы можете использовать, не будут учитываться.
я думаю, что вы должны построить некоторые думают по вашей собственной личности, я сделал что-то подобное раньше [например, когда Gmail показывает загрузку верхней там]
идея о том, чтобы массив затем добавить/удалить из него и продолжайте проверять его знать, если есть открытое соединение
код должен выглядеть следующим образом
var liveAjax = [];
//making ajax call
liveAjax[liveAjax.length] = true;
$.ajax({
url: 'ajax/test.html',
success: function(data) {
liveAjax[liveAjax.length] = false;
or delete liveAjax[liveAjax.length]
}
});
then checking the alive calls by
setInterval(function(){
//looping in liveAjax and check if there any true value, then there is ajax call elese nothing happens
},200);
Что-то вдоль линий этого JQuery (положить в голове) должны работать.
var loading = true;
$(window).load(function() {
loading = false;
}).ajaxStart(function() {
loading = true;
}).ajaxComplete(function() {
loading = false;
});
Подробнее читайте в ajaxStart.