我正在编写一段代码来捕获页面上的所有 ajax 响应。我设法通过为 javascript 直接 ajax 覆盖 XMLHttpRequest.onreadystatechange 或为 jQuery ajax 使用 ajaxComplete() 来做到这一点。
当我尝试多次使用 ajax 而不创建新的 XMLHttpObject 时,就会出现我的问题,例如:
var xhr = new XMLHttpRequest();
xhr.open("GET", '/echo/json/', true);
xhr.send();
xhr.open("GET", '/echo/json/', true);
xhr.send()
这使我的代码变得混乱,并且我得到了最大的堆栈错误。
这是我在 JSFiddle 上的测试代码:http: //jsfiddle.net/zxCfW/
var s_ajaxListener = {};
s_ajaxListener.tmpSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
console.log('additional state change');
};
XMLHttpRequest.prototype.send = function() {
s_ajaxListener.tmpOnReadyStateChange = this.onreadystatechange;
this.onreadystatechange = function() {
if (s_ajaxListener.tmpOnReadyStateChange){
s_ajaxListener.tmpOnReadyStateChange.apply(this, arguments);
}
if(this.readyState == 4 && this.status == 200) {
s_ajaxListener.callback();
this.onreadystatechange = s_ajaxListener.tmpOnReadyStateChange;
}
};
s_ajaxListener.tmpSend.apply(this, arguments);
};
$(document).ajaxComplete(s_ajaxListener.callback);
我相信这是因为 ajax 调用是异步的,所以原始的 onreadystatechange 不会重置为其默认值,但我不知道如何解决这个问题。