自定义XMLHttpRequest.prototype.open

时间:2013-04-02 15:42:14

标签: javascript jquery ajax xmlhttprequest

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

不,不是真的。只是,

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