如何覆盖XMLHttpRequest?

时间:2016-05-20 07:42:04

标签: javascript ajax xmlhttprequest override

我想覆盖“XMLHttpRequest”这个构造函数。

我只是想在我新建一个实例时发出警告,就像这样: (这不是我真正想要做的,只是一个例子)

var ajax_request = new XMLHttpRequest(); //then alert "new a XMLHttpRequest instance!"

然后我试试这个:

var orig_XMLHttpRequest = window.XMLHttpRequest;
window.XMLHttpRequest = function() {
    alert("new a XMLHttpRequest instance!");
    orig_XMLHttpRequest.apply(this, arguments);
};

但是当我新建一个实例时,

我在orig_XMLHttpRequest.apply(this,arguments)中收到此错误;

TypeError: Constructor XMLHttpRequest requires 'new'

那么,哪一步我做错了?如何覆盖XMLHttpRequest?或者这是不可能的?

我也试试这个:

var orig_XMLHttpRequest = window.XMLHttpRequest;
window.XMLHttpRequest = function() {
    alert("new a XMLHttpRequest instance!");
    new (Function.prototype.bind.apply(orig_XMLHttpRequest, arguments));
};

var ajax_request = new XMLHttpRequest();
ajax_request.open("POST", "./php/register.php", true);
ajax_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax_request.onreadystatechange = function() {.....};
ajax_request.send();

但我仍然有错误:(

TypeError: ajax_request.open is not a function

3 个答案:

答案 0 :(得分:1)

有趣的问题。

我已经能够修改你的第二个代码示例以使某些工作正常:

var orig_XMLHttpRequest = window.XMLHttpRequest;
window.XMLHttpRequest = function() {
  document.write("new a XMLHttpRequest instance!");
  return new orig_XMLHttpRequest();
};

var ajax_request = new XMLHttpRequest();
ajax_request.open("POST", "./php/register.php", true);
ajax_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax_request.onreadystatechange = function() {
  if (ajax_request.readyState === XMLHttpRequest.DONE) {
    console.log("request returned status code: " + ajax_request.status);
  }
}
ajax_request.onerror = function(e) {
  console.log("request failed: " + e.target.status);
  }

ajax_request.send();

答案 1 :(得分:1)

您可以使用原型 open 和 send 方法来覆盖 XMLHttpRequest。

XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
...
}

XMLHttpRequest.prototype.send = function () {
...
}

查看完整示例: https://runkiss.blogspot.com/2021/03/capture-xmlhttprequest-calls.html

答案 2 :(得分:0)

试试这个:

window.XMLHttpRequest = function() {
    alert("new a XMLHttpRequest instance!");
    orig_XMLHttpRequest.apply(this, arguments);
};

(编辑 - 我原来的方法犯了一个错误)