如何覆盖 XMLHttpRequest?
How to override XMLHttpRequest?
我想覆盖"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
试试这个:
window.XMLHttpRequest = function() {
alert("new a XMLHttpRequest instance!");
orig_XMLHttpRequest.apply(this, arguments);
};
(已编辑 - 我在原来的方法中犯了一个错误)
有趣的问题。
我已经能够修改您的第二个代码示例以使其正常工作:
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();
我想覆盖"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
试试这个:
window.XMLHttpRequest = function() {
alert("new a XMLHttpRequest instance!");
orig_XMLHttpRequest.apply(this, arguments);
};
(已编辑 - 我在原来的方法中犯了一个错误)
有趣的问题。
我已经能够修改您的第二个代码示例以使其正常工作:
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();