2013-07-30 4 views
1

У меня есть способ отслеживания текущих запросов Ajax, которые включают $ .ajaxSetup(), и подсчет beforeSends & завершает.

jsFiddle Demo

var ajaxProcs = 0; 

$.ajaxSetup({ 
    beforeSend : function() { ajaxProcs++; }, 
    complete : function() { ajaxProcs--; } 
}); 

Проблема заключается в том, если данный $ .ajax() вызов beforeSend или завершить его скинут правильное количество запросов Ajax работает.

Например, это перепишет его, и не добавьте 1 в счет ajaxProcs.

$.ajax({ 
    beforeSend : function() { /* blah blah */ } 
}); 

Можно ли иметь ОБА ajaxSetup И Переопределить пробег $ .ajax?

+0

Вы можете перезаписать jQuery ajax f unction и добавить свой собственный независимый код для подсчета. Очень уродливый и ненадежный, но возможно. –

ответ

3

Попробуйте это:

var ajaxProcs = 0; 
$(document).ajaxSend(function(){ 
    ajaxProcs++; 
}); 
$(document).ajaxComplete(function(){ 
    ajaxProcs--; 
}); 

Это будет работать на каждом Ajax вызова JQuery, независимо от того, что обратных вызовов привязываются к индивидуальным запросам.

+2

Если вы не используете 'ajaxSend' и' ajaxComplete' вместо этого, потому что 'ajaxStart' и' ajaxStop' будут запускаться только один раз если одновременно выполняется несколько запросов? – vsr

+0

Ах, да, совершенно верно, хорошо поймать. Отредактировано для исправления. – BenjaminCorey

2

ajaxSetup() содержит значения по умолчанию для параметров, которые могут быть переданы функции ajax(). Они применяются только в качестве значений по умолчанию, а не в том случае, если они указаны в фактическом вызове ajax().

JQuery's ajaxStart(), ajaxSend() и ajaxComplete() - это то, о чем вы, возможно, захотите прочитать. Они вызываются до и после каждого вызова ajax.

Существует опция global на индивидуальном вызове ajax(), который будет отключать эти глобальные функции.

Не совсем полный ответ, потому что он является надёжным, но, возможно, полезным.

+0

Я забыл, что использовал '$ (document) .ajaxStart()' и ajaxStop() для этого тоже где-то! Это прекрасно работает и замечательно: они не могут быть переопределены, они оба работают. Вот такой же пример с 2 ajaxStart/ajaxStop: http://jsfiddle.net/mcpDESIGNS/UJmuw/1/ –

1

Из-за дизайна jQuery я считаю, что лучше всего сделать правило, чтобы вызвать функцию ajaxSetup вручную из beforeSend. Даже если у jQuery был более OO-подход, вам все равно придется вызывать родителя - он не будет волшебным образом называть себя.

http://jsfiddle.net/mrcJ7/

var ajaxProcs = 0; 

var setupObj = { 
    beforeSend : function(xhr) { ajaxProcs++; console.log('Increased to: ' + ajaxProcs); }, 
    complete : function() { ajaxProcs--; console.log('Decreased to: ' + ajaxProcs); } 
}; 

$.ajaxSetup(setupObj); 

$.ajax({ 
    url: 'http://fiddle.jshell.net', 
    beforeSend : function (xhr) { 
     setupObj.beforeSend(xhr); 
    } 
}); 
4

Как об этом, давайте попробуем beforeSend() функцию как образец ..

$.ajaxSetup({ 
    beforeSend: function(){ 
     console.log('execute another beforeSend() function'); 
    } 
}); 

Тогда это ваша функция Ajax:

$.ajax({ 
    beforeSend : function() { 
     console.log('execute beforeSend() function'); 
     if('beforeSend' in $.ajaxSettings){ 
      $.ajaxSettings.beforeSend(); 
     } 
    } 
... 

И теперь он будет выполнять обе функции

Надеюсь, это поможет

+0

Очень хороший ответ. – Alexander

Смежные вопросы