80

我正在使用 .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(),但这似乎完全杀死了加载屏幕。

有什么想法可以实现吗?

4

2 回答 2

198

我想到了..

选项对象中有一个.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
});
于 2012-09-27T14:50:52.593 回答
16

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

解决方案 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:将属性设置globalfalse

$.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()事件。但是,它也会使 disable 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 文件中使用全局变量。但是,这是我能找到的最简单的解决方案。

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

于 2017-09-13T12:19:51.357 回答