Инициировать событие jQuery ajaxStop, когда существуют прерванные вызовы - PullRequest
3 голосов
/ 28 июня 2010

Я использовал jQuery ajaxSend и ajaxStop, чтобы показывать счетчик, когда активны запросы ajax. Это работает за исключением случаев, когда некоторые из моих плагинов прерывают свои запросы ajax, ajaxStop не срабатывает и не будет срабатывать до тех пор, пока страница не будет обновлена. Похоже, что прерванный запрос все еще считается в jQuery. Могу ли я сделать триггер ajaxStop или есть лучший способ?

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

Ну, я нашел способ, который мне очень нравится. Исправьте метод прерывания XMLHttpRequest, чтобы он уменьшал счетчик jjuery ajax и запускал обработчик, если это последний запрос. Пока не уверен, насколько хорошо он будет работать в разных браузерах.

var old_abort = XMLHttpRequest.prototype.abort;
XMLHttpRequest.prototype.abort = function(){
    jQuery.proxy(old_abort, this)();
    if ( jQuery.active-- === 1 )
        jQuery.event.trigger( "ajaxStop" );
};
2 голосов
/ 19 марта 2011

Кажется, это проблема только в jQuery 1.4.2 для dataType = "json", см. http://forum.jquery.com/topic/ajaxstart-not-fired-when-jquery-active-changes-from-0-to-1

Обновитесь до jQuery 1.5.1 или примените патч, опубликованный Джейком выше. Кроме того, мне пришлось изменить патч следующим образом, прежде чем он будет корректно работать для моих случаев использования:

f_abort = XMLHttpRequest.prototype.abort;
XMLHttpRequest.prototype.abort = function() {
  $.proxy(f_abort, this)();
  if ($.active === 1) {
    $.event.trigger("ajaxStop");
    $.active = 0;
  } else if ($.active > 1) {
    $.active--;
  }
};
1 голос
/ 28 июня 2010

Вместо этого я бы использовал событие complete - оно выполняется независимо от того, что:

завершено (локальное событие)
Это событие вызывается независимо от того, если запрос был успешным, или нет. Ты сможешь всегда получать полный звонок, даже для синхронных запросов.

$.ajax({
   complete: function(){
     // hide your spinner
   }
 });

не уверен, если вам это нужно, но вы можете вызвать событие ajaxStop. $(this).trigger('ajaxStop');

...