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

时间:2011-09-15 19:14:09

标签: javascript jquery ajax

假设我定义了一些全局Ajax事件处理程序(ajaxStart,ajaxStop和ajaxError)。通常我对此很好,但对于一个请求,我想要禁用ajaxError处理程序,但仍像往常一样运行ajaxStart和ajaxStop处理程序。 jQuery ajax function documentation提到了“global”参数,该参数可以设置为false并传递给$ .ajax函数以禁用所有全局Ajax事件处理程序,但是他们没有提到任何只禁用某些全局处理程序的方法。 / p>

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

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

4 个答案:

答案 0 :(得分:92)

这可能并不困难。

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

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

    // Normal processing
});

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

<强> See it in action

答案 1 :(得分: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
});

答案 2 :(得分:8)

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

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

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

寻找全球活动。

答案 3 :(得分:8)

您可以将$.event.global.ajaxError设置为false以暂时禁用调用全局错误回调。使用特殊请求的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的建议。这种技术需要将标志设置在2个位置,您可以忘记一个并且最多可以意外地禁用全局处理程序。另一个原因是Jon的技术应该保证在jQuery版本中工作,其中设置一些内部标志是不可靠的。