123

たとえば、最初のページに移動するページを作成しようとしています。10秒間非アクティブ(ユーザーがどこもクリックしない)。残りはjQueryを使用していますが、テスト関数のset/clearは純粋なjavascriptです。

欲求不満の中で、この関数のようなものに行き着き、ページをクリックするたびに呼び出すことができると期待していました。タイマーは正常に起動しますが、クリックしてもリセットされません。関数が最初の10秒間に5回呼び出されると、5つのアラートが表示されます...clearTimeoutがありません...

function endAndStartTimer() {
    window.clearTimeout(timer);
    var timer;
    //var millisecBeforeRedirect = 10000; 
    timer = window.setTimeout(function(){alert('Hello!');},10000); 
}

誰かがトリックを行うコードのいくつかの行を手に入れましたか?-クリックが停止したら、タイマーをリセットして開始します。-タイマーが当たったとき。10秒は何かをします。

4

7 に答える 7

254

timer 関数の外で宣言する必要があります。それ以外の場合は、関数呼び出しごとにまったく新しい変数を取得します。

var timer;
function endAndStartTimer() {
  window.clearTimeout(timer);
  //var millisecBeforeRedirect = 10000; 
  timer = window.setTimeout(function(){alert('Hello!');},10000); 
}
于 2010-06-10T14:30:29.403 に答える
48

問題は、timer変数がローカルであり、関数呼び出しのたびにその値が失われることです。

永続化する必要があり、関数の外に置くことができます。または、変数をグローバルとして公開したくない場合は、クロージャに格納できます。たとえば、次のようになります。

var endAndStartTimer = (function () {
  var timer; // variable persisted here
  return function () {
    window.clearTimeout(timer);
    //var millisecBeforeRedirect = 10000; 
    timer = window.setTimeout(function(){alert('Hello!');},10000); 
  };
})();
于 2010-06-10T14:31:28.993 に答える
15

これは、timer が関数のローカル変数であるためです。

関数の外で作成してみてください。

于 2010-06-10T14:30:49.573 に答える
2

これがいくつかの良い習慣のコーディング規則に違反しているかどうかはわかりませんが、私は通常これを出します:

if(typeof __t == 'undefined')
        __t = 0;
clearTimeout(__t);
__t = setTimeout(callback, 1000);

これにより、関数からタイマーを宣言する必要がなくなります。

編集:これも各呼び出しで新しい変数を宣言しませんが、常に同じものをリサイクルします。

お役に立てれば。

于 2012-07-24T15:16:37.197 に答える