为请求禁用一些jQuery全局Ajax事件处理程序

Disabling some jQuery global Ajax event handlers for a request

本文关键字:全局 Ajax 事件处理 程序 jQuery 请求      更新时间:2023-09-26

假设我已经定义了一些全局Ajax事件处理程序(ajaxStart, ajaxStop和ajaxError)。通常我很好,但对于一个请求,我想禁用ajaxError处理程序,但仍然像往常一样运行ajaxStart和ajaxStop处理程序。jQuery ajax函数文档中提到了"global"参数,该参数可以设置为false并传递给$。函数来禁用所有全局ajax事件处理程序,但是他们没有提到任何方法来禁用一些全局处理程序。

我可以通过对传递给ajaxError函数的ajaxSettings对象的"url"属性进行测试来防止ajaxError处理程序,但这似乎有些笨拙。这里有人知道一种方法来禁用ajaxError函数从运行,这将是清楚的人看在$所在的地方。正在调用Ajax函数?

我可以提供一个简单的例子,如果有人想看它

这是可能的,也不难做到。

你只需要设置你的全局错误处理程序(.ajaxError)来接收一些jQuery可以提供给它的参数:

$("div.log").ajaxError(function(evt, xhr, settings) {
    if(settings.suppressErrors) {
        return;
    }
    // Normal processing
});
在此之后,您可以将suppressErrors: true添加到您所做的任何AJAX请求的设置中,如果它失败,错误处理程序将返回而不做它通常做的事情。

查看效果

当您查看来自jquery/ajax源代码https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582的这个if语句时,它是许多同类语句中的一个,很明显您的问题不能仅通过jquery参数来解决。

我的建议是:
  • set global为false,就像Vaibhav Gupta说的

  • 在特定的ajax调用中将全局处理程序映射到本地,并通过$.event触发全局事件。触发方法

示例:

$.ajax({
    url: "test.html",
    global: false,
    beforeSend: function(){$.event.trigger('ajaxStart');},
    complete: function(){$.event.trigger('ajaxStop');},
    error: your_error_handler
});

尝试在ajax请求中使用global: false,如:

 $.ajax({
   url: "test.html",
   global: false,
   // ...
 });

来源:http://docs.jquery.com/Ajax_Events

查找全局事件

可以设置$.event.global.ajaxErrorfalse,暂时禁用全局错误回调。使用特殊请求的errorcomplete回调来设置标志:

$.ajax({
    url: 'some.domain.com/',
}).error(function(jXHR){
    // Disable global error logging
    $.event.global.ajaxError = false;
}).complete(function(){
    // Enable global error logging
    $.event.global.ajaxError = true;
});

在jsFiddle上有一个例子。

既然如此,我想补充一句,我还是更喜欢乔恩的提议。这种技术需要在两个地方设置标志,其中一个可能会被忘记,而另一个可能会意外禁用全局处理程序。另一个原因是Jon的技术应该保证在设置一些内部标志不可靠的jQuery版本中工作。