【问题标题】:Modify ajax response before any bound callbacks get executed在执行任何绑定回调之前修改 ajax 响应
【发布时间】:2012-10-10 16:06:11
【问题描述】:

问题

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

解决方案

标准的 ajax 事件,无论是全局的还是本地的,都没有提供在触发应用绑定回调之前修改响应的好方法。

ajax 事件的触发顺序是jquery's ajax event docs 中指示的顺序,即

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

请注意,在响应从服务器返回之后但在运行成功/错误回调之前没有执行任何钩子,例如一种ajaxReturnajaxSend 之后但在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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以使用任何全局 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
      });
      

      });

      【讨论】:

      • 从我的测试来看,所有绑定到全局 ajax 事件的回调都是在特定请求的回调之后执行的,即使是先绑定全局回调:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2013-06-03
      • 2016-02-11
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多