Отключить ajaxStart() и ajaxStop() для конкретного запроса


Я использую .ajaxStart () and .ajaxStop (), чтобы показать модальный во время выполнения запроса ajax. (между началом и остановкой)

теперь я хотел бы добавить функцию longpoll, которая продолжает ждать уведомлений, аналогичную той, что находится в левом верхнем углу этого сайта.

моя проблема теперь заключается в отключении этого модального только для запроса longpolling..

Регистрация "экран загрузки" и отключить обработчики:

$(document).ajaxStart(handleAjaxStart);
$(document).ajaxStop(handleAjaxStop);

мой longpoll функция:

$.ajax({
    timeout: 35000,
    url: longPollUrl,
    success: function(data){
        if(data.queCount) $('#numQueCount').html(data.queCount);
        if(data.queAccept) $('#numQueAccept').html(data.queAccept);
    }, 
    dataType: 'json',
    complete: longpoll
});

пробовал:

$().off('ajaxStart');
$().off('ajaxStop');

..и повторное подключение обработчиков после начала опроса, но без радости.

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

любые идеи, как это может быть достигнуто?

2 64

2 ответа:

Я понял..

в объекте options есть атрибут .ajax() принимает под названием global.

если установлено значение false, это не вызовет ajaxStart событие для вызова.

$.ajax({
    timeout: 35000,
    url: longPollUrl,
    success: function(data){
        if(data.queCount) $('#numQueCount').html(data.queCount);
        if(data.queAccept) $('#numQueAccept').html(data.queAccept);
    }, 
    global: false,     // this makes sure ajaxStart is not triggered
    dataType: 'json',
    complete: longpoll
});

после прочтения всех возможных решений, я хочу объединить ответы.

Решение 1: Bind / Unbind

//binding
$(document).bind("ajaxStart.mine", function() {
    $('#ajaxProgress').show();
});

$(document).bind("ajaxStop.mine", function() {
    $('#ajaxProgress').hide();
});

//Unbinding
$(document).unbind(".mine");

это амортизированное решение. До jQuery 1.9 глобальные события ajax, такие как ajaxStart, ajaxStop, ajaxError и т. д. может быть привязан к любому элементу. После того, как в jQuery 1.9:

начиная с jQuery 1.9, все обработчики для глобальных событий Ajax jQuery, в том числе и те, которые добавлены с помощью.метод ajaxStart (), должен быть прикреплен к документ.

поэтому мы не можем привязать / отменить привязку этих событий к пользовательским пространствам имен.

решение 2: Установите свойство global до false

$.ajax({
        url: "google.com",
        type: "GET",
        dataType: "json",
        global: false, //This is the key property.
        success: function (data) {
                   console.log(data);
                },
        error: function (data) {
                   console.log(data);
                }
       });

это решение работает для отключения ajaxStart()/ajaxStop() событие(с). Однако, это также делает отключить ajaxComplete(), ajaxError(), ajaxSend(), ajaxSuccess(). Если вы не используете эти глобальные события, это кажется ок, но когда это необходимо, вы должны вернуться и изменить свое решение для всех страниц, где вы установили global: false.

решение 3: Используйте глобальную переменную

var showLoadingEnabled = true;
$(document).ready(function () {
    $('#loading')
        .hide()  // at first, just hide it
        .ajaxStart(function () {
            if (showLoadingEnabled) {
                $(this).show();
            }
        })
        .ajaxStop(function () {
            if (showLoadingEnabled) {
                $(this).hide();
            }
        });
});


function justAnotherFunction() {
    window.showLoadingEnabled = false;
    $.ajax({
        url: 'www.google.com',
        type: 'GET',
        complete: function (data) {
            window.showLoadingEnabled = true;
            console.log(data);
        }
    });
}

глобальные переменные не должны использоваться в файлах javascript. Однако это самое простое решение, которое я могу найти.

Я предпочел третье решение для моего проекта.