0

我正在编写一段代码来捕获页面上的所有 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 不会重置为其默认值,但我不知道如何解决这个问题。

4

0 回答 0