Мой ответ ниже и ответы предыдущих пользователей только пытаются проверить, выполняет ли браузер запрос XmlHttpRequest (т.е. ajaxy).
Вы спросили, можете ли вы сказать, выполняет ли браузер какой-либо сетевой запрос (то есть загрузка изображений / CSS или, возможно, длительный запрос кометы). Я не знаю ни одного javascript API, который бы сказал вам об этом - они могут существовать, но я подозреваю, что если они это сделают, они будут зависеть от браузера [если кто-то знает ответ на этот вопрос, пожалуйста, включите его]. Очевидно, что такие инструменты, как Firebug и dynaTrace, могут обнаруживать сетевую активность, но я думаю, что эти инструменты «подключаются» к браузеру намного глубже, чем код JavaScript.
Сказав все это, если вы хотите посчитать XHR, порожденные 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 с глобальным параметром, установленным в false, и поэтому вряд ли является пуленепробиваемым;
Также имейте в виду, что activeXhrCount учитывает только XHR, порожденные jQuery - те из других библиотек, которые вы можете использовать, не будут учитываться.