我试图将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事件?
答案 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;