【问题标题】:jQuery ajax override global onSuccess handlerjQuery ajax 覆盖全局 onSuccess 处理程序
【发布时间】:2017-09-28 16:28:13
【问题描述】:

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

基本上,流程应该是:

  1. 执行.ajax调用(或.get.post等)
  2. 假设之前的调用成功,将调用全局onSuccessGlobal 处理程序,并从请求中传递结果数据。此数据在此方法中转换
  3. 上一个处理程序返回转换后的数据后,由本地onSuccess处理程序接收,该处理程序使用该数据向页面添加内容等。

我知道Ajax events 的存在,但是据我所知,ajaxSuccess 事件看起来不会: a) 在本地 success 事件之前调用 b) 将修改后的数据发送到本地事件

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

谢谢!

【问题讨论】:

  • 为什么不在$.ajaxonSuccess 回调中调用您的全局onSuccess?然后等待数据从您的全局数据返回,然后再在onSuccess 中执行任何其他操作:$.ajax...onSuccess: function (data) { var transformed = globalOnSuccess(data); // do something with transformed }
  • 听起来像是 X/Y 问题?
  • @CarlMarkham:因为是代码库范围内的更改,所以让本地 onSuccess 调用全局调用是不可能的(我相信 > 600 百个调用)。
  • @adeneo,是的,这是我想尝试的一个非常粗略的解决方案。根本问题是通过 ajax 请求发生的持久性 XSS 注入,我认为过滤通过 ajax 调用收到的任何输出将是一个值得尝试的一体化解决方案……我知道这绝对不是保护的方法与 XSS 攻击相比,但我们有点着急。

标签: javascript jquery ajax


【解决方案1】:

我最终做的是覆盖$.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) 之前使用 enable,其中 someFilteringFunction 将负责返回无 XSS 的 JSON。

哦,JS,你有时会变得多么肮脏:)

【讨论】:

  • 顺便说一句,我使用的是 jquery 1.11,所以它使用旧的 $.ajax 签名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多