首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猴子补丁XMLHTTPRequest.onreadystatechange

猴子补丁XMLHTTPRequest.onreadystatechange
EN

Stack Overflow用户
提问于 2012-09-25 10:46:25
回答 3查看 4.7K关注 0票数 7

我正在尝试添加一个函数,当页面发出的每个ajax请求返回时,都会调用这个函数。

我知道这听起来像是一个可怕的想法,但是这个用例是非常特别的。我想通过控制台(jqconsole)使用某个SDK,但在控制台内显示ajax调用的状态和结果,而不修改外部SDK。

我看过this post,它有很好的信息,但没有关于猴子修补回调的信息,这似乎超出了我的JavaScript技能。

P.S不能使用jQuery,因为它只支持从jQuery发出的ajax调用,而不是直接从XMLHTTPRequests发出的调用,这里就是这种情况。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-25 16:31:44

要修补XMLHttpRequest,您需要知道AJAX请求通常是如何构造的:

请求的请求构造函数( open())

  • Sending
  1. (.send).

setRequestHeader()

通用补丁

代码语言:javascript
复制
(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处理程序。为简单起见,我没有包含onloadother events的代码。此外,我没有考虑到使用addEventListener添加的事件。

之前的补丁程序针对所有请求运行。但是,如果您只想将补丁限制为特定的请求,该怎么办?具有特定URL或异步标志和特定请求正文的请求?

条件性猴子补丁

示例:拦截请求正文中包含POST的所有测试请求

代码语言:javascript
复制
(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);

使用的主要技术是透明重写,使用...

代码语言:javascript
复制
var original = xhr.method; 
xhr.method = function(){
    /*...*/;
    return original.apply(this, arguments);
};

我的例子非常基础,可以扩展以满足您的确切愿望。然而,这取决于你。

票数 12
EN

Stack Overflow用户

发布于 2012-09-25 12:39:42

假设你可以忽略IE...

代码语言:javascript
复制
//Totally untested code, typed at the SO <textarea>... but the concept *should* work, let me know if it doesn't.
var OldXMLRequest = XMLHttpRequest;

// Create a new instance
function XMLHttpRequest() {
  var ajax = new OldXMLRequest();

  // save old function
  var f = ajax.onreadystatechange;
  ajax.onreadystatechange = function() {
    console.log("Whatever!");
    f(); // Call the old function
  }
  return ajax;
}
票数 0
EN

Stack Overflow用户

发布于 2017-06-03 22:39:06

你可以从中国人写的Ajax-hook中学习!

启用猴子补丁XMLHTTPRequest是一个高级的js

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12575572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档