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

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

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

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

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

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

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

在此之后,你可以添加suppressErrors: true到你所做的任何AJAX请求的设置,如果失败,error handling程序将返回,而不会执行通常的操作。

看到它的行动

当你从jquery / ajax源码https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582看这个if语句时,它是很多同类中的一种,很明显,你的问题不能单靠一个jquery参数来解决。;

我的build议是:

  • 像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 }); 

您可以将$.event.global.ajaxError设置$.event.global.ajaxError false以禁用暂时调用全局错误callback。 使用errorcomplete特殊请求的callback来设置标志:

 $.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上有一个例子。

提出这个问题,我想补充一点,我仍然会select乔恩的build议。 这个技巧要求在两个地方设置标志,你可以忘记一个标志和最多全局处理程序被意外closures。 另一个原因是Jon的技术应该保证能够跨越jQuery的版本,其中设置一些内部标志是不可靠的。

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

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

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

寻找全球事件。