如何为每个AJAX请求/响应事件添加回调。

时间:2013-11-01 14:57:32

标签: javascript

我试图将javascript注入网页并捕获所有的ajax请求。

function addXMLRequestCallback(send_callback) {
    var oldSend, i;
    if(XMLHttpRequest.send_callbacks) {
        XMLHttpRequest.send_callbacks.push(send_callback);
    } else {
        XMLHttpRequest.send_callbacks = [send_callback];
        oldSend = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.send = function () {
            for (i = 0; i < XMLHttpRequest.send_callbacks.length; i++) {
                XMLHttpRequest.send_callbacks[i](this, arguments);
            }
            oldSend.apply(this, arguments);
        }
    }
}

*从SO

复制到某处

这个函数允许我捕获所有的send()事件,但我想捕获XMLHttpRequest.responseText,这需要XMLHttpRequest.onload。上面的方法不适用于XMLHttpRequest.onload,因为它实际上不是一个函数,直接将函数分配给onload事件最终会被使用该实例的其他脚本覆盖。

有没有一种方法可以在没有覆盖的情况下将回调事件分配给onload事件?

2 个答案:

答案 0 :(得分:2)

您可以使用“更标准”的方式:

oldSend.apply(this,arguments)之前,添加以下内容:

this.addEventListener("load",function() {
    // do something with this.responseText
},false);

答案 1 :(得分:-1)

或者您可以尝试使用自己的对象完全更改XMLHttpRequest。 (但它是肮脏的黑客,你不应该做那样的事情。也可能是不可预测的)。

Niet the Dark Absol的解决方案显然更好

var oldRequest = XMLHttpRequest;
XMLHttpRequest = function(){
    var returnObject = new oldRequest();
    returnObject.addEventListener('load',function(){console.log('load callback fired')})
    return returnObject;
}

var req = new XMLHttpRequest(); //req with callback;