有几种方法可以实现您的要求。它们之间的唯一区别是它们的实现方式,您可以选择哪种方法最适合您的特定情况。这些方法还取决于您使用的 jQuery 版本,因此我将把这个答案分成两部分。
对于 jQuery 1.5 及更高版本
在初始化后添加多个回调
从 jQuery 1.5 开始,您可以添加多个回调,这要归功于经过大修的 API 和新引入的由 .ajax 返回的 jqXHR 对象。它实现了 Promise(参见 Deferreds)接口,我们可以利用它来发挥我们的优势:
// fn to handle button-toggling
var toggleButton = function() {
var button = $(".button");
button.button(button.button("option", "disabled") ? "enable" : "disable");
}
// store returned jqXHR object in a var so we can reference to it
var req = $.ajax({
beforeSend: toggleButton,
success: function(msg){
/* Do what you want */
}
}).success(toggleButton);
// we can add even more callbacks
req.success(function(){ ... });
使用预过滤器
jQuery 1.5 还引入了prefilters,您可以使用它来替换 jQuery 1.4 的全局配置:
// good practice: don't repeat yourself, especially selectors
var button = $(".button");
$.ajaxPrefilter(function(options, _, jqXHR) {
button.button("disable");
jqXHR.complete(function() {
button.button("enable");
});
});
注意:jqXHR section of the $.ajax entry 有关于使用jqXHR.success() 的通知:
弃用通知:jqXHR.success()、jqXHR.error() 和
jqXHR.complete() 回调从 jQuery 1.8 开始被弃用。准备
您最终删除的代码,请使用 jqXHR.done()、jqXHR.fail()、
和 jqXHR.always() 代替。
对于 jQuery 1.4 及更早版本
事件和全局配置
使用.ajaxStart 和.ajaxStop 将回调绑定到特定的选择器。触发这些回调的事件将在所有 Ajax 请求上触发。
$(".button").ajaxStart(function(){
$(this).button("disable");
}).ajaxStop(function(){
$(this).button("enable");
});
使用.ajaxSetup 设置全局ajax 配置。传递给 .ajaxSetup 的设置对象将应用于所有 Ajax 请求,即使是由简写 .get、.getJSON 和 .post 发出的请求。请注意,不建议这样做,因为它很容易破坏其功能。
$.ajaxSetup({
beforeSend: function(){
$(".button").button("disable");
},
success: function(){
$(".button").button("enable");
}
});
过滤掉全局事件回调中的请求
如果您需要过滤掉某些请求,您可以使用.ajaxSend 和.ajaxComplete 执行此操作,您可以在其中检查 Ajax settings 对象。像这样的:
var button = $(".button");
// fn to handle filtering and button-toggling
var toggleButton = function(settings) {
if (settings.url == "/specific/url")
button.button(button.button("option", "disabled") ?
"enable" : "disable");
}
};
// bind handlers to the callbacks
button.ajaxSend(function(e,x,settings){
toggleButton(settings);
}).ajaxComplete(function(e,x,settings){
toggleButton(settings);
});
这也可以通过前面提到的.ajaxSetup 对传递给回调处理程序的settings 对象进行相同类型的检查来完成。