2010-11-21 26 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