猴子补丁XMLHTTPRequest.onreadystatechange
猴子如何修补XMLHTTPRequest
的onreadystatechange
功能。我正在尝试添加一个从页面发出的每个ajax请求返回时将被调用的函数。
我知道这听起来像一个可怕的主意,但是用例非常特殊。我想将特定的SDK与控制台(jqconsole)一起使用,但在不修改外部SDK的情况下显示控制台内ajax调用的状态和结果。
我看过这篇文章,它提供了很好的信息,但是没有任何关于猴子修补回调的内容,这似乎超出了我的JavaScript技能。
PS无法使用jQuery,因为它仅支持由jQuery而不是XMLHTTPRequests
直接来自jQuery的ajax调用,在这种情况下。
回答:
要进行monkey-patchXMLHttpRequest
,您需要了解通常如何构造AJAX请求:
- 构造函数调用
- 准备请求(
setRequestHeader()
,open()
) - 发送请求(
.send
)。
回答:
(function(xhr) { function banana(xhrInstance) { // Example
console.log('Monkey RS: ' + xhrInstance.readyState);
}
// Capture request before any network activity occurs:
var send = xhr.send;
xhr.send = function(data) {
var rsc = this.onreadystatechange;
if (rsc) {
// "onreadystatechange" exists. Monkey-patch it
this.onreadystatechange = function() {
banana(this);
return rsc.apply(this, arguments);
};
}
return send.apply(this, arguments);
};
})(XMLHttpRequest.prototype);
先前假定已将onreadystatechange
其分配给onreadystatechange
处理程序。为了简单起见,我没有包含其他事件的代码,例如onload
。另外,我也没有考虑使用添加的事件addEventListener
。
先前的补丁程序将针对所有请求运行。但是,如果您只想将补丁限制为特定请求怎么办?具有特定URL或异步标志以及特定请求正文的请求?
回答:
示例:拦截POST
其请求正文包含“ TEST”的所有请求
(function(xhr) { function banana(xhrInstance) { // Example
console.log('Monkey RS: ' + xhrInstance.readyState);
}
//
var open = xhr.open;
xhr.open = function(method, url, async) {
// Test if method is POST
if (/^POST$/i.test(method)) {
var send = this.send;
this.send = function(data) {
// Test if request body contains "TEST"
if (typeof data === 'string' && data.indexOf('TEST') >= 0) {
var rsc = this.onreadystatechange;
if (rsc) {
// Apply monkey-patch
this.onreadystatechange = function() {
banana(this);
return rsc.apply(this, arguments);
};
}
}
return send.apply(this, arguments);
};
}
return open.apply(this, arguments);
};
})(XMLHttpRequest.prototype);
使用的主要技术是使用…的透明重写。
var original = xhr.method; xhr.method = function(){
/*...*/;
return original.apply(this, arguments);
};
我的示例非常基础,可以扩展以满足您的确切愿望。但是,这取决于您。
以上是 猴子补丁XMLHTTPRequest.onreadystatechange 的全部内容, 来源链接: utcz.com/qa/405401.html