2010-04-14 1 views
4

Есть ли способ с JQUERY или Javascript для обнаружения в любое время, когда окно браузера загружает что-то, делая вызов ajax, загружая изображение и т. Д. В принципе, любая сетевая активность?JQUERY или JS есть способ обнаружить в любое время, когда окно загружается? В принципе, любая сетевая активность?

ответ

2

Мой ответ ниже и ответы предыдущих пользователей только пытаются проверить, в настоящее время браузер выполняет запрос 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 - те из других библиотек, которые вы можете использовать, не будут учитываться.

1

я думаю, что вы должны построить некоторые думают по вашей собственной личности, я сделал что-то подобное раньше [например, когда 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); 
3

Что-то вдоль линий этого JQuery (положить в голове) должны работать.

var loading = true; 

$(window).load(function() { 
    loading = false; 
}).ajaxStart(function() { 
    loading = true; 
}).ajaxComplete(function() { 
    loading = false; 
}); 

Подробнее читайте в ajaxStart.