web-dev-qa-db-ja.com

すべてのsetTimeoutイベントを無効にするにはどうすればよいですか?

私はajaxとasp.netを使用しています。 iには、setTimeoutを使用して他の多くのjavascript関数を作成するjavascript関数があります。非同期ポストバックが発生した後、これらすべてのsetTimeoutedイベントを無効にします。どうやってやるの?

50
MonsterMMORPG

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() はエラーをスローしないため、ここで競合/タイミングの問題はありません。

100
Nick Craver

タイマーが設定されているコードにアクセスできない場合、ニックの答えは機能しない可能性があるため、私が考えることができるのはこのハックだけです。

これはハックです、注意して使用してください!

// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
    clearTimeout(i); 
}

基本的には、最も高いタイマーIDを取得し、それ以下のすべてをクリアします。 しかし、クリアしたくない他のタイマーをクリアすることも可能です!

106
SeanDowney

これをグローバルに実行できるかどうかはわかりませんが、最も一般的な方法は clearTimeout を使用することです。 setTimeout()の戻り値をclearTimeout()に渡すと、グローバル変数を使用してすべてのタイムアウト変数を格納できます。

4
Robin

まず、私はこのコードを使用していました:

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を使用)

3