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でそれをテストするために起こっています。
は、私はこれを行うであろう: 'oldSend.call(この引数[0]);'または私はちょうど引数配列に渡すことができ、より良い方法があります? if文を削除します。 – Joel
配列を第2引数とする '.apply()'を使うことができます。 –
ありがとう、素晴らしい作品! – Joel