1

我试图将 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);
        }
    }
}

*从某处复制

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

有没有一种方法可以将回调分配给 onload 事件而不会被覆盖?

4

2 回答 2

2

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

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

this.addEventListener("load",function() {
    // do something with this.responseText
},false);
于 2013-11-01T15:01:54.310 回答
-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;
于 2013-11-01T15:27:05.247 回答