猴子补丁XMLHTTPRequest.onreadystatechange

猴子补丁XMLHTTPRequest.onreadystatechange,第1张

猴子补丁XMLHTTPRequest.onreadystatechange

要进行monkey-patch

XMLHttpRequest
,您需要了解通常如何构造AJAX请求

  1. 构造函数调用
  2. 准备请求(
    setRequestHeader()
    open()
  3. 发送请求(
    .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);};

我的示例非常基础,可以扩展以满足您的确切愿望。但是,这取决于您。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4909592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存