Javascript 拦截所有ajax调用?

Javascript 拦截所有ajax调用?,javascript,jquery,ajax,dom-events,Javascript,Jquery,Ajax,Dom Events,我试图截获所有AJAX调用,以检查AJAX响应是否包含我从PHP脚本中以JSON形式发送的特定错误代码(代码:ACCESS_DENIED,SYSTEM_error,NOT_FOUND) 我知道一个人可以做这样的事情: $('.log').ajaxSuccess(function(e, xhr, settings) { }); 但是-只有当“ajaxSuccess”事件冒泡到.log div时,此功能才起作用吗?我说得对吗?我可以通过将“ajaxSuccess”事件绑定到文档来实现我想要的吗 $

我试图截获所有AJAX调用,以检查AJAX响应是否包含我从PHP脚本中以JSON形式发送的特定错误代码(代码:ACCESS_DENIED,SYSTEM_error,NOT_FOUND)

我知道一个人可以做这样的事情:

$('.log').ajaxSuccess(function(e, xhr, settings) {
});
但是-只有当“ajaxSuccess”事件冒泡到.log div时,此功能才起作用吗?我说得对吗?我可以通过将“ajaxSuccess”事件绑定到文档来实现我想要的吗

$(document).ajaxSuccess(function(e, xhr, settings) {
});
我可以在jQuery或原始JavaScript中执行此操作。

来自:

只要Ajax请求成功完成,jQuery就会触发ajaxSuccess事件。此时将执行使用.ajaxSuccess()方法注册的所有处理程序

因此,选择器并不定义“捕获”事件的位置(因为,老实说,ajax事件的性质并不是从DOM元素开始的),而是定义一个处理将被默认的范围(即,
this
将指向该元素)

总之,它应该正是您想要的

尝试使用Mockjax.js


它允许您劫持对服务器的AJAX调用并模拟位置。

如果您使用的是jQuery,
$。ajaxSuccess
是一个不错的选项,但这里有一个更通用的选项,它将拦截来自所有框架的XHR调用(我已经用ExtJS和jQuery对其进行了测试-即使同时加载多个框架,它也应该可以工作)。它已经过IE8、Chrome和Firefox的测试

(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);

我已经发布了一个截获AJAX调用并将AJAX调用持续时间发回服务器进行统计分析的程序。

截获AJAX调用的原始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代码:

$.ajaxSetup({
    beforeSend: function (xhr,settings) {
        alert(settings.data);
        alert(settings.url);
    }
});

参考资料:

另请参见:如何使用此库:根据您的实现,我在NPM上发布了一些既适用于请求又适用于响应的内容!太棒了。最近,我使用这种技术向一些AJAX请求添加CSRF头。在将来,我将研究如何使用您的lib。仅适用于使用此方法并希望访问ajax调用的响应数据的任何人。您可以通过
self.response
onReadyStateChange()
方法中获得响应。如何阻止脚本拦截jquery.ajax调用?我必须在哪里插入noIntercept值?