為特定請求禁用ajaxStart()和ajaxStop()




jquery long-polling (2)

我正在使用.ajaxStart()和.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() ,它將在函數的第一行返回,但這似乎完全殺死了加載屏幕。

任何想法如何實現這一目標?


我想到了..

選項對像中有一個屬性.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:綁定/解除綁定

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

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

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

這是一個折舊的解決方案。 在jQuery 1.9之前,像ajaxStart,ajaxStop,ajaxError等ajax的全局事件可以綁定到任何元素。 在jQuery 1.9之後:

從jQuery 1.9開始,jQuery全局Ajax事件的所有處理程序,包括那些添加了.ajaxStart()方法的處理程序,都必須附加到document。

因此,我們無法將這些事件綁定/解除綁定到自定義命名空間。

解決方案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文件中使用全局變量。 但是,這是最簡單的解決方案,我可以找到。

我首選的是我項目的第三個解決方案。





long-polling