14

私の問題は、タイマーを停止できないことです。

このフォーラムからタイムアウトを設定する方法がありました。識別子をグローバル変数に格納することになっています。偶然、「mydiv」を隠した後もまだ実行されていることがわかりました。

また、再帰関数が複数のインスタンスを作成するのか、タイムアウト用に 1 つだけ作成するのかを知る必要もあります。最初は毎回「var mytimer」を上書きすると思っていたからです。今、私はよくわかりません。

タイマーを停止する確実な方法は何でしょうか??

var updatetimer= function () {
//do stuff
        setTimeout(function (){updatetimer();}, 10000);

}//end function


//this should start and stop the timer
$("#mybutton").click(function(e) { 
         e.preventDefault();
         if($('#mydiv').is(':visible')){
                   $('#mydiv').fadeOut('normal');
             clearTimeout(updatetimer);

        }else{
                   $('#mydiv').fadeIn('normal');
                   updatetimer();
               }
});

ありがとう、リチャード

4

7 に答える 7

25

ほとんどの人はこれが機能しない理由を理解していると思いますが、更新されたコードを提供すると思いました. クリアできるようにタイムアウトを変数に割り当てることを除いて、それはあなたのものとほとんど同じです。

また、ロジックをインラインで実行したり、関数内で「this」の値を変更したり、パラメーターを関数に渡したりする場合は、setTimeout の無名関数が最適です。関数を呼び出すだけの場合は、関数の名前を最初のパラメーターとして渡すだけで十分です。

var timer = null; 

var updatetimer = function () {
    //do stuff

    // By the way, can just pass in the function name instead of an anonymous
    // function unless if you want to pass parameters or change the value of 'this'
    timer = setTimeout(updatetimer, 10000);
};

//this should start and stop the timer
$("#mybutton").click(function(e) { 
     e.preventDefault();
     if($('#mydiv').is(':visible')){
        $('#mydiv').fadeOut('normal');
        clearTimeout(timer);  // Since the timeout is assigned to a variable, we can successfully clear it now

    } else{
        $('#mydiv').fadeIn('normal');
        updatetimer();
   }
});
于 2009-06-15T14:38:53.587 に答える
7

「setTimeout」と「clearTimeout」を誤解していると思います。

後でキャンセルしたいタイマーを設定したい場合は、次のようにします。

foo = setTimeout(function, time);

それから電話する

clearTimeout(foo);

そのタイマーをキャンセルしたい場合。

お役に立てれば!

于 2009-06-15T10:39:19.433 に答える
2

書かれているように、 mytimer はタイムアウト識別子の値を持たない関数であるため、 clearTimeout ステートメントは何も達成しません。

ここでは再帰はまったく見られませんが、setTimeoutが返す値を保存する必要があります。これを複数の潜在的なイベントとペアにする必要がある場合は、検索できるキー値に対して保存する必要があります-要素のようなものおそらく?

于 2009-06-15T10:41:31.363 に答える
0

上記のように、このコードが機能しない主な理由は、間違ったものを呼び出しに渡していることです。呼び出しclearTimeoutの戻り値を保存し、これを関数の代わりに clearTimeout に渡す必要があります。自体を参照します。setTimeoutupdateFunction

改善のための 2 番目の提案として、再帰的なタイムアウト関数と呼ばれるものがある場合は、setIntervalキャンセルされるまで一定の間隔で関数を実行するメソッドを使用することをお勧めします。これにより、メソッドで実行しようとしているのと同じことが達成さupdateFunctionれますが、遅延関数に「do stuff」ロジックを含めるだけでよいため、よりクリーンであり、ネストされたクロージャーを作成しないため、おそらくよりパフォーマンスが高くなります。 . さらに、それは何かを数えなければならない正しい方法ですよね?:-)

于 2009-06-15T10:52:36.907 に答える