2010-11-21 80 views
2

我想更改XMLHttpRequest发送函数,以便在请求完成之前和请求完成之后调用一个函数。以下是我迄今为止:在javascript原型上更改函数

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测试它。

回答

4

您需要在this的上下文中调用old函数。

例如:oldSend.call(本)

+0

所以将我这样做:'oldSend.call(此,参数[0]);'或是有更好的方法,我可以只是传递参数阵列中?从而消除了if语句。 – Joel 2010-11-21 01:55:42

+2

你可以使用'.apply()',它将一个数组作为第二个参数。 – 2010-11-21 01:59:03

+0

谢谢,效果很棒! – Joel 2010-11-21 03:17:54