-2

次の Javascript コードは、IE9 を除くすべてのブラウザーで動作します。修正は何ですか?

setTimeout('doSomething();clearTimeout();',500);

デバッガーは、すべてのタイムアウトをクリアしているだけなのに、ID 番号を clearTimeout() に渡すことを期待していると言っています。

4

1 に答える 1

6

他の人が言ったように、clearTimeout()引数がなければ何もしません。clearTimeout()クリアするタイムアウトを指定する必要があります。これはすべてのブラウザに適用されます。エラーを報告しているのは IE だけかもしれませんが、IE のすべてで問題が発生しています。

おそらく、あなたが呼び出している理由は、呼び出され続ける場合に備えて をクリアする必要がclearTimeout()あると思うからですか? setTimeout()これは正しくありませsetTimeout()ん。指定された時間が経過した後、そのコードが 1 回だけ呼び出されます。

したがって、すでにトリガーされた後にタイムアウトをクリアしようとしているので、とにかくクリアするものは何もありません。

setInterval()繰り返しタイムアウトをトリガーする別のコマンドが呼び出されます。何度も何度も呼び出されるのを止めるには、これをクリアする必要がありますが、とにかく使用するのは一般的に悪い考えであると考えられているためsetInterval()、ここではあまり詳しく説明しません。

setIntervalもう 1 つすべきことは、文字列パラメーターを使用して呼び出すことを避けることです。代わりに、直接呼び出したい関数を指定するだけです。

つまり、コードは次のようになります。

setTimeout(doSomething,500);

あなたの例がすべてのブラウザーで正常に動作するには、これで十分なはずです。

私が言ったように、あなたのケースではタイムアウトをクリアする必要はありませんが、別のインスタンスでそれをクリアする必要がある場合は、値を返す必要がありますsetTimeout(または)。setIntervalこの値はタイマーへの参照オブジェクトであり、この参照を に渡す必要がありますclearTimeout

すなわち:

var timer;
....
timer = setTimeout(doSomething,500);
....
....
//something happened, I need to cancel the timeout:
clearTimeout(timer);

物事を解決するのに役立つことを願っています。

于 2012-09-14T21:55:20.477 に答える