在执行任何绑定回调之前修改ajax响应

ale*_*anu 2 javascript jquery

问题

在触发所有绑定回调之前,我需要一种方法来修改应用程序中的所有ajax响应.

全局和本地的标准ajax事件在触发应用程序绑定回调之前不提供修改响应的好方法.

通过AJAX事件被触发的顺序是一个在指定的jQuery的AJAX事件文档

  • ajaxStart(全球活动)
  • beforeSend(本地活动)
  • ajaxSend(全球事件)
  • 成功(本地活动)
  • ajaxSuccess(全球事件)
  • 错误(本地事件)
  • ajaxError(全球事件)
  • 完成(本地活动)
  • ajaxComplete(全球事件)
  • ajaxStop(全球赛事)

请注意,没有响应后执行钩从服务器回来,但成功/ erorr回调之前,如一种运行ajaxReturn后,ajaxSend但在此之前success|error

我这样做的方法是使用之前执行的$ .ajaxPrefilterajaxStart并将已绑定的成功/错误回调包装在另一个函数中,这将允许我修改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);
    }
});
Run Code Online (Sandbox Code Playgroud)

我不得不提到我正在使用它进行测试,所以我不关心性能,内存和开销.

Hug*_*rte 7

如果您想在服务器到达事件处理程序之前修改从服务器返回的数据,请使用dataFilter:

    jquery.ajaxSetup({
        dataFilter: function (data, type) {
            //modify your data here

            return data;
        }
    });
Run Code Online (Sandbox Code Playgroud)