jQuery ajax覆盖全局onSuccess处理程序

时间:2017-09-26 16:29:17

标签: javascript jquery ajax

是否有可能让jQuery .ajax调用执行全局 onSuccess 处理程序(现在让我们称之为 onSuccessGlobal 之前 strong>执行本地 onSuccess 处理程序?

基本上,流程应该是:

  1. 执行.ajax来电(或.get.post等)
  2. 假设上一次调用成功,则调用全局onSuccessGlobal处理程序,从请求中传递结果数据。此数据已在此方法中转换
  3. 在前一个处理程序返回转换后的数据之后,它由本地onSuccess处理程序接收,该处理程序使用数据向页面添加内容等。
  4. 我知道Ajax events的存在,但是如此AFAIK,它看起来不会ajaxSuccess事件: a)在本地success事件之前调用 b)将修改后的数据发送到本地事件

    为了实现类似的功能,我想我可以使用全局ajaxSend事件来中止当前的ajax请求,使用我需要的处理程序创建一个包装的请求,然后发送新的包装请求。但我希望有人可以提供一些见解,因为这听起来相当复杂。

    谢谢!

1 个答案:

答案 0 :(得分:0)

我最终做的是覆盖$.ajax功能。不是很漂亮,但它完成了工作:

// Add `enableAjaxFiltering` & `disableAjaxFiltering` methods to jQuery object
(function( $ ) {
  // keep a reference to the old ajax function
  var _old = $.ajax;

  // use this namespace
  $.ajaxFiltering = {};

  // this will enable filtering in any $.ajax() call
  $.ajaxFiltering.enable = function(filter) {
    $.ajax = function(settings) {
      if (settings.success) {
        var callback = settings.success;
        settings.success = function(data) {
          newData = filter(data);
          return callback(newData);
        }
      }
      return _old.apply(this, [settings]);
    }
  };

  // this will disable filtering in any $.ajax call
  $.ajaxFiltering.disable = function() {
    $.ajax = function(settings) {
      return _old.apply(this, [settings]);
    }
  };

}( jQuery ));

然后你只需在$.ajaxFiltering.enable(someFilteringFunction)之前使用启用,其中someFilteringFunction将负责返回无XSS的JSON。

哦,JS,你有时会有多脏:)