首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否拦截所有ajax调用?

是否拦截所有ajax调用?
EN

Stack Overflow用户
提问于 2011-07-31 00:57:18
回答 4查看 38.7K关注 0票数 28

我正在尝试拦截所有AJAX调用,以检查AJAX响应是否包含我在PHP脚本中以JSON形式发送的特定错误代码(代码: ACCESS_DENIED、SYSTEM_ERROR、NOT_FOUND)。

我知道有人可以这样做:

代码语言:javascript
复制
$('.log').ajaxSuccess(function(e, xhr, settings) {
});

但是-只有当"ajaxSuccess“事件冒泡到.log div时才能起作用吗?我说的对吗?我可以通过将"ajaxSuccess“事件绑定到文档来实现我想要的吗?

代码语言:javascript
复制
$(document).ajaxSuccess(function(e, xhr, settings) {
});

我可以在jQuery或原始JavaScript中做到这一点。

EN

回答 4

Stack Overflow用户

发布于 2012-05-29 18:03:55

如果您使用的是jQuery,$.ajaxSuccess是一个很好的选择,但是这里有一个稍微通用一点的选项,它将拦截来自所有框架的XHR调用(我已经用ExtJS和jQuery测试过它-即使同时加载多个框架,它也应该可以工作)。它已经在IE8、Chrome和火狐浏览器上进行了测试。

代码语言:javascript
复制
(function(XHR) {
    "use strict";

    var open = XHR.prototype.open;
    var send = XHR.prototype.send;

    XHR.prototype.open = function(method, url, async, user, pass) {
        this._url = url;
        open.call(this, method, url, async, user, pass);
    };

    XHR.prototype.send = function(data) {
        var self = this;
        var oldOnReadyStateChange;
        var url = this._url;

        function onReadyStateChange() {
            if(self.readyState == 4 /* complete */) {
                /* This is where you can put code that you want to execute post-complete*/
                /* URL is kept in this._url */
            }

            if(oldOnReadyStateChange) {
                oldOnReadyStateChange();
            }
        }

        /* Set xhr.noIntercept to true to disable the interceptor for a particular call */
        if(!this.noIntercept) {            
            if(this.addEventListener) {
                this.addEventListener("readystatechange", onReadyStateChange, false);
            } else {
                oldOnReadyStateChange = this.onreadystatechange; 
                this.onreadystatechange = onReadyStateChange;
            }
        }

        send.call(this, data);
    }
})(XMLHttpRequest);

我已经发布了一个more specific example on github,它拦截AJAX调用并将AJAX调用持续时间发送回服务器进行统计分析。

票数 70
EN

Stack Overflow用户

发布于 2018-03-15 00:17:54

截取ajax调用的原始javacript代码:

代码语言:javascript
复制
(function(send) {
    XMLHttpRequest.prototype.send = function(body) {
        var info="send data\r\n"+body;
        alert(info);
        send.call(this, body);
    };
})(XMLHttpRequest.prototype.send);

拦截ajax的jQuery代码:

代码语言:javascript
复制
$.ajaxSetup({
    beforeSend: function (xhr,settings) {
        alert(settings.data);
        alert(settings.url);
    }
});

参考:http://myprogrammingnotes.com/intercept-ajax-calls-jquery.html

票数 11
EN

Stack Overflow用户

发布于 2021-07-01 06:04:35

最好的方法,就是我找到的https://lowrey.me/intercept-2/

代码语言:javascript
复制
const intercept = (urlmatch, callback) => {
  let send = XMLHttpRequest.prototype.send;
  XMLHttpRequest.prototype.send = function() {
    this.addEventListener('readystatechange', function() {
      if (this.responseURL.includes(urlmatch) && this.readyState === 4) {
        callback(this);
      }
    }, false);
    send.apply(this, arguments);
  };
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6884616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档