Подтвердить что ты не робот

Отключение некоторых jQuery глобальных обработчиков событий Ajax для запроса

Предположим, что у меня есть некоторые глобальные обработчики событий Ajax, определенные (ajaxStart, ajaxStop и ajaxError). Обычно я в порядке с этим, но по одному запросу я хочу отключить обработчик ajaxError, но все равно запускаю обработчики ajaxStart и ajaxStop, как обычно. jQuery ajax-документация упоминает "глобальный" параметр, который может быть установлен в false и передан функции $.ajax, чтобы отключить все глобальные события Ajax обработчики, но они не упоминают о каком-либо способе отключения только некоторых глобальных обработчиков.

Я могу предотвратить обработчик ajaxError, выполнив тест по свойству "url" объекта ajaxSettings, который передается функции ajaxError, но это кажется несколько неуклюжим. Кто-нибудь знает, как отключить функцию ajaxError от запуска, что было бы ясно для кого-то, кто ищет в месте, где вызывается функция $.ajax?

Я могу представить простой пример, если кто-то хочет его увидеть.

4b9b3361

Ответ 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

Ищите глобальные события.