为特定请求禁用 ajaxStart() 和 ajaxStop()

Posted

技术标签:

【中文标题】为特定请求禁用 ajaxStart() 和 ajaxStop()【英文标题】:Disable ajaxStart() and ajaxStop() for a specific request 【发布时间】:2012-09-18 06:08:10 【问题描述】:

我正在使用 .ajaxStart() 和 .ajaxStop() 在发出 ajax 请求时显示模式。 (在开始和停止之间)

现在我想添加一个longpoll函数,一直等待通知,类似于本站左上角的那个。

我现在的问题在于仅针对长轮询请求禁用此模式..

注册“加载屏幕”开启和关闭处理程序:

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

我的长轮询函数:

$.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() 中引入一个全局变量,该变量将在函数的第一行返回,但这似乎完全终止了加载屏幕。

有什么想法可以实现吗?

【问题讨论】:

【参考方案1】:

我想通了..

选项对象.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
);

【讨论】:

很高兴他们想到了这个确切的场景,我们需要绕过那些包罗万象的 ajax 函数。将 global 设置为 false 将禁止所有全局触发器:ajaxComplete(), ajaxError(), ajaxSend(), ajaxStart(), ajaxStop(), ajaxSuccess(),而不仅仅是 Start 和 Stop。 好发现!并且在 jQuery 方面有很好的想法来先发制人。【参考方案2】:

阅读所有可能的解决方案后,我想结合答案。

解决方案 1:绑定/取消绑定

//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 开始,jQuery 全局 Ajax 事件的所有处理程序, 包括那些使用 .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 文件中使用全局变量。不过,这是我能找到的最简单的解决方案。

我更喜欢我的项目的第三种解决方案。

【讨论】:

以上是关于为特定请求禁用 ajaxStart() 和 ajaxStop()的主要内容,如果未能解决你的问题,请参考以下文章

ajaxStart()和ajaxStop()方法

jquery ajaxstart ajaxstop show hide

ajax监测开始执行及结束执行

为特定请求/URL/端点禁用登录 gunicorn

杂记 包含 serialize().ajaxStart() .ajaxStop()以及其他

是否有理由不将 JSONP 用于 AJA~X 请求?