【发布时间】:2012-10-10 16:06:11
【问题描述】:
问题
我需要一种方法来在所有绑定回调被触发之前修改应用中的所有 ajax 响应。
解决方案
标准的 ajax 事件,无论是全局的还是本地的,都没有提供在触发应用绑定回调之前修改响应的好方法。
ajax 事件的触发顺序是jquery's ajax event docs 中指示的顺序,即
- ajaxStart(全局事件)
- beforeSend(本地事件)
- ajaxSend(全局事件)
- 成功(本地事件)
- ajaxSuccess(全局事件)
- 错误(本地事件)
- ajaxError(全局事件)
- 完成(本地事件)
- ajaxComplete(全局事件)
- ajaxStop(全局事件)
请注意,在响应从服务器返回之后但在运行成功/错误回调之前没有执行任何钩子,例如一种ajaxReturn 在ajaxSend 之后但在success|error 之前
我破解它的方法是使用在ajaxStart 之前执行的$.ajaxPrefilter,并将已经绑定的成功/错误回调包装在另一个函数中,这将允许我修改options 对象,从而修改返回的数据.
以下是执行包装的实用函数和示例:
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);
}
});
我不得不提一下,我将它用于测试目的,所以我不关心性能、内存和开销。
【问题讨论】:
标签: javascript jquery