Javascript 在执行任何绑定回调之前修改ajax响应
问题 我需要一种在触发所有绑定回调之前修改应用程序中所有ajax响应的方法 解决方案 在触发应用程序绑定回调之前,标准的ajax事件(全局和本地)都不能提供一种很好的方法来修改响应 ajax事件被触发的顺序是Javascript 在执行任何绑定回调之前修改ajax响应,javascript,jquery,Javascript,Jquery,问题 我需要一种在触发所有绑定回调之前修改应用程序中所有ajax响应的方法 解决方案 在触发应用程序绑定回调之前,标准的ajax事件(全局和本地)都不能提供一种很好的方法来修改响应 ajax事件被触发的顺序是 ajaxStart(全球活动) 发送前(本地事件) ajaxSend(全球活动) 成功(本地活动) ajaxSuccess(全球活动) 错误(本地事件) ajaxError(全局事件) 完成(本地活动) ajaxComplete(全球活动) ajaxStop(全球活动) 请注意,在响应
- ajaxStart(全球活动)
- 发送前(本地事件)
- ajaxSend(全球活动)
- 成功(本地活动)
- ajaxSuccess(全球活动)
- 错误(本地事件)
- ajaxError(全局事件)
- 完成(本地活动)
- ajaxComplete(全球活动)
- ajaxStop(全球活动)
ajaxSend
之后,但在success|error
之前,有一种ajaxReturn
我破解它的方法是使用在ajaxStart
之前执行的方法,并将已绑定的成功/错误回调封装在另一个函数中,该函数允许我修改选项
对象,从而修改返回的数据
下面是进行包装的实用程序函数和示例:
var alterResponse = function (opts) {
var callback = function (options, originalOptions, jqXHR) {
if (options.url.match(opts.urlMatch)) {
// Cache original callback.
var originalSuccess = originalOptions.success || options.success;
originalOptions.success = options.success = function () {
// Call wrapper that will modify the response object.
opts.successWrapper.call(null, options, originalOptions, jqXHR, originalSuccess);
};
}
};
if (opts.dataTypes) {
$.ajaxPrefilter(opts.dataTypes, callback)
}
else {
$.ajaxPrefilter(callback);
}
};
alterResponse({
urlMatch: /myurl/g, // Filter urls you what to tamper with.
successWrapper: function (options, originalOptions, jqXHR, originalFn) {
options.data.customVar = 'customValue';
originalFn(options, originalOptions, jqXHR);
}
});
我必须提到,我使用它是为了测试,所以我不关心性能、内存和开销。您可以使用任何全局ajax事件
$(document).ajaxSuccess(function() {
alert("An individual AJAX call has completed successfully");
});
//or...
$(document).ajaxComplete(function() {
alert("ALL current AJAX calls have completed");
});
//or..
$(function() {
$.ajaxSetup({
complete: function(xhr, textStatus) {
// will be raised whenever an AJAX request completes (success or failure)
},
success: function(result) {
// will be raised whenever an AJAX request succeeds
},
etc ... you could use any available option
});
})) 如果要在服务器返回的数据到达事件处理程序之前修改数据,请使用dataFilter:
jquery.ajaxSetup({
dataFilter: function (data, type) {
//modify your data here
return data;
}
});
根据我的测试,绑定到全局ajax事件的所有回调都在特定请求的回调之后执行,即使全局回调首先绑定:(