假设我已经定义了一些全局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.ajaxError
为false
,暂时禁用全局错误回调。使用特殊请求的error
和complete
回调来设置标志:
$.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版本中工作。