是否可以修改XMLHttpRequest.prototype.open()?

时间:2017-07-20 06:38:58

标签: javascript ajax xmlhttprequest

我正在尝试将回调注入XMLHttpRequest.prototype.open(),以便我可以知道方法和网址,以及为效果报告设置时间戳(单独使用修改后的XMLHttpRequest.prototype.send())。

这是我到目前为止所得到的:

function addXMLRequestCallback(open, callback) {
    var nativeOpen, nativeSend, i;
    if (XMLHttpRequest.callbacks) {
        XMLHttpRequest.callbacks.push(callback);
    } else {
        XMLHttpRequest.callbacks = [callback];
        nativeOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function() {
            open.forEach(function(item) {
                // not sure what to do here...
            });
        }
        nativeSend = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.send = function() {
            for (i = 0; i < XMLHttpRequest.callbacks.length; i++) {
                XMLHttpRequest.callbacks[i](this);
            }
            nativeSend.apply(this, arguments);
        }
    }
}
addXMLRequestCallback(function(method,url){
    // Maybe instead I should put code here...
}, function(xhr) {
    // then do something here?
});

1 个答案:

答案 0 :(得分:0)

您使用send方法所采用的方法是正确的。在下面的代码片段中,我只调用了一个在调用XMLHttpRequest的{​​{1}}方法时调用的侦听器。我相信你可以为open实现相同的功能。

send

但是,问问自己是否真的需要修改内置原型。考虑创建一个执行相同操作但不修改原型的包装类。