私はajaxとasp.netを使用しています。 iには、setTimeoutを使用して他の多くのjavascript関数を作成するjavascript関数があります。非同期ポストバックが発生した後、これらすべてのsetTimeoutedイベントを無効にします。どうやってやるの?
setTimeout()
を呼び出すとき、タイマーIDを保存して、クリアできるようにします。多数のタイムアウトを作成している場合、配列はIDを保存するための適切なオプションです。例えば:
_var timeouts = [];
//then, store when you create them
timeouts.Push( setTimeout( { ... }, 1000) );
_
次に、それらをクリアしたい場合:
_for (var i = 0; i < timeouts.length; i++) {
clearTimeout(timeouts[i]);
}
//quick reset of the timer array you just cleared
timeouts = [];
_
@ Robert 以下に示すように、タイムアウトが既に発生している場合、 clearTimeout()
はエラーをスローしないため、ここで競合/タイミングの問題はありません。
タイマーが設定されているコードにアクセスできない場合、ニックの答えは機能しない可能性があるため、私が考えることができるのはこのハックだけです。
これはハックです、注意して使用してください!
// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
clearTimeout(i);
}
基本的には、最も高いタイマーIDを取得し、それ以下のすべてをクリアします。 しかし、クリアしたくない他のタイマーをクリアすることも可能です!
これをグローバルに実行できるかどうかはわかりませんが、最も一般的な方法は clearTimeout を使用することです。 setTimeout()の戻り値をclearTimeout()に渡すと、グローバル変数を使用してすべてのタイムアウト変数を格納できます。
まず、私はこのコードを使用していました:
var x = setTimeout('');
for (var i = 0; i < x; i++)
clearTimeout(x);
ただし、このコードの平和はGoogle Chromeでは機能しませんでした。そこで、これを改善しました。
var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared
for (var i = 0; i <= x; i++)
clearTimeout(i);
最後に、上記のコメントで述べたように、ハックですので、慎重に使用してください。
編集:ループで使用される間違った変数を修正しました(xの代わりにiを使用)