2010-11-21 18 views
2

XMLHttpRequest send関数を変更して、要求が行われる前と要求が完了した後に関数が呼び出されるようにしたいとします。javacriptプロトタイプの関数を変更する

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

+2

配列を第2引数とする '.apply()'を使うことができます。 –

+0

ありがとう、素晴らしい作品! – Joel

関連する問題