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

Javascript 为请求禁用某些jQuery全局Ajax事件处理程序,javascript,jquery,ajax,Javascript,Jquery,Ajax,假设我定义了一些全局Ajax事件处理程序(ajaxStart、ajaxStop和ajaxError)。通常我对此没有意见,但对于一个请求,我想禁用ajaxError处理程序,但仍然像往常一样运行ajaxStart和ajaxStop处理程序。中提到了“global”参数,该参数可以设置为false并传递给$.ajax函数以禁用所有全局ajax事件处理程序,但没有提到仅禁用某些全局处理程序的任何方法 我可以通过对传递给ajaxError函数的ajaxSettings对象的“url”属性进行测试来防止

假设我定义了一些全局Ajax事件处理程序(ajaxStart、ajaxStop和ajaxError)。通常我对此没有意见,但对于一个请求,我想禁用ajaxError处理程序,但仍然像往常一样运行ajaxStart和ajaxStop处理程序。中提到了“global”参数,该参数可以设置为false并传递给$.ajax函数以禁用所有全局ajax事件处理程序,但没有提到仅禁用某些全局处理程序的任何方法

我可以通过对传递给ajaxError函数的ajaxSettings对象的“url”属性进行测试来防止ajaxError处理程序,但这似乎有点笨拙。这里有没有人知道一种让ajaxError函数无法运行的方法,这一点大家都很清楚 在调用$.ajax函数的地方


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

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

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


寻找全球性事件。

这是可能的,也不难做到

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

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

    // Normal processing
});
在此之后,您可以将
suppressErrors:true
添加到您发出的任何AJAX请求的设置中,如果失败,错误处理程序将返回,而不执行它通常执行的操作


当您查看来自jquery/ajax源代码的if语句时(这是许多同类语句中的一种),很明显,单靠jquery参数无法解决您的问题

我的建议是:

  • 将global设置为false,就像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
设置为
false
以暂时禁用调用全局错误回调。使用特殊请求的
错误
完成
回调设置标志:

$.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;
});
上提供了一个示例


既然如此,我想补充一点,我还是更喜欢乔恩的建议。此技术需要在两个位置设置标志,其中一个位置可能会忘记,并且最多会意外禁用全局处理程序。另一个原因是,Jon的技术应该保证在设置一些内部标志不可靠的jQuery发行版中工作。

您是否尝试过(我猜是在这个问题上)将自己的
.error
处理程序添加到
$.ajax()中
调用,然后将
return false
放在函数末尾以停止处理?是的,我试过了。它没有解决问题。全局处理程序仍在运行。如果我没记错的话,全局处理程序(success、error、complete)在success/error/complete处理程序之前运行。我试过了,它禁用了所有全局ajax处理程序。我只是想禁用某些全局ajax处理程序。这对解决类似问题有很大帮助。谢谢这是我所知道的最好的答案think@AbrarJahin答案实际上是错误的,因为问题是如何仅禁用ajaxError事件,而不禁用任何其他全局事件。这个答案禁用了所有全局事件,因此完全是错误的。这看起来是迄今为止最好的答案。我喜欢你的例子。我尝试了你的想法,它奏效了。我可能会把赏金奖励给你,除非其他人能想出一个更优雅的解决方案。。。讨厌。@JimmyBreck McKye:我完全理解你的不安,但options对象的使用方式与此完全相同——参见@Jon-fair上的示例——如果文档中给出了我们以这种方式使用对象的示例,那么我们似乎应该能够依赖它。不过,我可能仍然会尝试在字段名前加前缀,以避免有朝一日发生命名冲突的可能性。这看起来可能会阻止错误处理程序,但可能会导致其他微妙的问题。beforeSend处理程序只应在第一个Ajax请求开始时运行。如果已经有另一个Ajax请求正在进行,则不应该运行它。ajaxStop函数在所有Ajax请求停止时运行。如果存在其他Ajax请求,则不应运行它。如果没有更好的答案,我还是可以试试你的答案。我确认你可以用这个来启动全球活动。示例:beforeSend:function(){if(jQuery.active==0){$.event.trigger('ajaxStart')}