自定义XMLHttpRequest.prototype.open

var open = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, uri, async, user, pass) { this.addEventListener("readystatechange", function(event) { if(this.readyState == 4){ var self = this; var response = { method: method, uri: uri, responseText: self.responseText }; console.log(response); } else { console.log(this.readyState); } }, false); open.call(this, method, uri, async, user, pass); }; 

我正在尝试在发送之前听XHR。 在$.ajax方法中类似于jQuery的beforeSend 。

我的目标是在发送之前监听所有XHR。 如果this.readyState === 1我想最接近的是检查上面的this.readyState === 1

上面的代码会导致像jQuery这样的任何ajax库出现故障,因为我在XMLHttpRequest上使用了原型吗?

我正在尝试在发送之前听XHR。

然后尝试欺骗send()方法,而不是open()方法。

上面的代码会导致像jQuery这样的任何ajax库出现故障,因为我在XMLHttpRequest上使用了原型吗?

不,不是真的。 只要,

  • 它们将无法在那些libs选择不使用XMLHttpRequest (特别是IE)的情况下工作
  • …如果浏览器不支持XMLHttpRequest对象(或者不支持访问或修改其原型),甚至会失败
  • libs可以通过解除引用函数来解决你的欺骗行为(尽管我不知道任何常见的lib)
  • 您的代码使用固定数量的参数调用本机方法,不确定它是否会影响任何内容,并且它不会重新返回结果(即使我们知道它是undefined )。 要100%确定,请使用return open.apply(this, arguments);