Отключить 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 ответа:
Я понял..
в объекте 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. Однако это самое простое решение, которое я могу найти.
Я предпочел третье решение для моего проекта.