Отключение некоторых jQuery глобальных обработчиков событий Ajax для запроса
Предположим, что у меня есть некоторые глобальные обработчики событий Ajax, определенные (ajaxStart, ajaxStop и ajaxError). Обычно я в порядке с этим, но по одному запросу я хочу отключить обработчик ajaxError, но все равно запускаю обработчики ajaxStart и ajaxStop, как обычно. jQuery ajax-документация упоминает "глобальный" параметр, который может быть установлен в false и передан функции $.ajax, чтобы отключить все глобальные события Ajax обработчики, но они не упоминают о каком-либо способе отключения только некоторых глобальных обработчиков.
Я могу предотвратить обработчик ajaxError, выполнив тест по свойству "url" объекта ajaxSettings, который передается функции ajaxError, но это кажется несколько неуклюжим. Кто-нибудь знает, как отключить функцию ajaxError от запуска, что было бы ясно для кого-то, кто ищет
в месте, где вызывается функция $.ajax?
Я могу представить простой пример, если кто-то хочет его увидеть.
Ответы
Ответ 1
Это возможно и не сложно сделать.
Вам просто нужно настроить свой глобальный обработчик ошибок (.ajaxError
), чтобы получить несколько параметров, которые может предоставить ему jQuery:
$("div.log").ajaxError(function(evt, xhr, settings) {
if(settings.suppressErrors) {
return;
}
// Normal processing
});
После этого вы можете добавить suppressErrors: true
к настройкам любого сделанного вами запроса AJAX, и если он не сработает, обработчик ошибок вернется, не выполняя то, что он обычно делает.
Посмотрите на действие.
Ответ 2
Когда вы смотрите на эту инструкцию if из источника jquery/ajax https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582, который является одним из многих подобных типов, он ясно, что ваша проблема не может быть решена только с помощью параметра jquery.
Мое предложение было бы:
-
устанавливает глобальное значение false, как сказал Вайбхав Гупта
-
сопоставьте глобальные обработчики с локальными в конкретном вызове ajax и вызовите глобальное событие с помощью метода $.event.trigger
Пример:
$.ajax({
url: "test.html",
global: false,
beforeSend: function(){$.event.trigger('ajaxStart');},
complete: function(){$.event.trigger('ajaxStop');},
error: your_error_handler
});
Ответ 3
Вы можете установить $.event.global.ajaxError
на false
, чтобы временно отключить вызов глобального обратного вызова. Используйте обратные вызовы error
и complete
вашего специального запроса для установки флагов:
$.ajax({
url: 'some.domain.com/',
}).error(function(jXHR){
// Disable global error logging
$.event.global.ajaxError = false;
}).complete(function(){
// Enable global error logging
$.event.global.ajaxError = true;
});
Пример доступен на jsFiddle.
Чтобы быть представленным, я хочу добавить, что я бы предпочел предложение Джона. Для этого метода необходимо установить флаг в 2 местах, из которых вы могли бы его забыть, и до того, как глобальные обработчики будут отключены случайно. Другая причина заключается в том, что метод Jon должен быть гарантированно работать через выпуски jQuery, где установка некоторых внутренних флагов не является надежной.
Ответ 4
попробуйте использовать global: false
в вашем запросе ajax, например:
$.ajax({
url: "test.html",
global: false,
// ...
});
source:: http://docs.jquery.com/Ajax_Events
Ищите глобальные события.