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

Eli*_*ria 43 javascript ajax jquery

假设我定义了一些全局Ajax事件处理程序(ajaxStart,ajaxStop和ajaxError).通常我对此很好,但对于一个请求,我想要禁用ajaxError处理程序,但仍像往常一样运行ajaxStart和ajaxStop处理程序.在jQuery的AJAX功能的文件中提到,可以设置为false,并传递到$就功能禁用所有全局AJAX事件处理程序的"全球性"的参数,但他们没有提及任何办法只能禁用一些全球处理器.

我可以通过对传递给ajaxError函数的ajaxSettings对象的"url"属性进行测试来阻止ajaxError处理程序,但这看起来有点笨拙.这里有没有人知道一种方法来禁止运行ajaxError函数,这对于那些正在调用$ .ajax函数的地方的人来说是很清楚的吗?

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

Jon*_*Jon 94

这可能并不困难.

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

$("div.log").ajaxError(function(evt, xhr, settings) {
    if(settings.suppressErrors) {
        return;
    }

    // Normal processing
});
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以添加suppressErrors: true您所做的任何AJAX请求的设置,如果失败,错误处理程序将返回而不执行正常操作.

看到它在行动.

  • 向我们实际上不拥有的对象添加字段似乎很糟糕。 (2认同)

top*_*pek 15

当您从jquery/ajax源https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582查看此if语句时,它是许多同类中的一种,它很明显,单独的jquery参数无法解决您的问题.

我的建议是:

  • 像Vaibhav Gupta所说,将全局设为假

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

样品:

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


Aug*_*ing 9

您可以设置$.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;
});
Run Code Online (Sandbox Code Playgroud)

jsFiddle上有一个例子.

在提出这个问题时,我想补充一点,我仍然会更喜欢Jon的建议.这种技术需要将标志设置在2个位置,您可以忘记一个并且最多可以意外地禁用全局处理程序.另一个原因是Jon的技术应该保证在jQuery版本中工作,其中设置一些内部标志是不可靠的.


Vai*_*pta 8

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

 $.ajax({
   url: "test.html",
   global: false,
   // ...
 });
Run Code Online (Sandbox Code Playgroud)

source :: http://docs.jquery.com/Ajax_Events

寻找全球活动.

  • 我尝试过,它禁用了所有全局ajax处理程序。我只是想禁用某些全局ajax处理程序。 (2认同)