在javascript原型上更改功能

时间:2010-11-21 01:43:57

标签: javascript ajax function prototype override

我想更改XMLHttpRequest发送功能,以便在发出请求之前和请求完成之后调用函数。以下是我到目前为止的情况:

var oldSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function() {
    //this never gets called
    oldOnReady = this.onreadystatechange;
    this.onreadystatechange = function() {
        oldOnReady();
        ajaxStopped();
    }

    ajaxStarted();

    // according to http://www.w3.org/TR/XMLHttpRequest/
    // there's only ever 0 or 1 parameters passed into this method
    if(arguments && arguments.length > 0) {
        oldSend(arguments[0]); //gets to here, calls this method, then nothing happens
    } else {
        oldSend();
    }
}

function ajaxStarted() {
    ajaxCount++;
    document.getElementById("buttonClicky").innerHTML = "Count: " + ajaxCount;
}

function ajaxStopped() {
    $("#isRunning")[0].innerHTML = "stopped";
    ajaxCount--;
    document.getElementById("buttonClicky").innerHTML = "Count: " + ajaxCount;
}

但是,我在这里做错了,因为一旦它遇到oldSend()调用,它就永远不会返回或触发onreadystatechange事件。所以我必须在这里做点错误。有任何想法吗?我设置了一个断点,当我打电话给它时它会被击中:

$.ajax({
    type: "GET",
    url: "file.txt",
    success: function(result) {
                    //this never gets called
        document.getElementById("myDiv").innerHTML = result;
    }
});

所以我的新功能被调用了。我想只是不知道如何调用旧函数。有关如何修复此代码的任何想法,以便实际发出Ajax请求并调用我的新回调吗?

注意:我知道基本上这样做的JQuery事件。但我这样做,所以我可以使用任何Ajax调用(Mootools,GWT等)。我正好用Jquery来测试它。

1 个答案:

答案 0 :(得分:4)

您需要在old

的上下文中调用this个函数

例如:oldSend.call(this)