要进行monkey-patch
XMLHttpRequest,您需要了解通常如何构造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);};
我的示例非常基础,可以扩展以满足您的确切愿望。但是,这取决于您。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)