2011-08-15 15 views
0

jQueryでautplayを使って簡単なスライダを作成しました。自動再生が有効な場合は、関数を指すsetTimeoutが設定されます。この関数は、それ自体に再帰的なsetTimeoutを持ちます。アニメーションのクロムタイムアウト問題

クロムを除くすべてがうまく動作します。私はタブを変更して、しばらく待って戻って、スライダーが怒っている。タイムアウトの複数のインスタンスがアクティブであるように見えますが、タイムアウトを同じ変数に指定しているので、そうではありません。

いくつかの関連するコード:

var timer; 

    function autoplay() { 
    currentPosition++; 
    if(currentPosition == numberOfSlides) { 
     // last slide 
     currentPosition = 0; 
    } 
    manageNavigation(currentPosition); 

    // Hide/show controls 
    manageControls(currentPosition); 

    // animate the slides 
    slideshowAnimate(); 

    // set timer 
    if(autoplay_enable) { 
     //clearTimeout(timer); 
     timer = setTimeout(function() { autoplay() }, interval*1000)  
    } 
    } 
    function setTimer() { 
    if(autoplay_enable) { 
     timer = setTimeout(function() { autoplay() }, interval*1000)  
    } 
    } 

    setTimer(); 

答えて

0

いいえ、timerの値をリセットすると、現在のタイマーをキャンセルしません。そのためにはclearTimeoutが必要です。すべてのタイマーホールドはタイマーへの数値参照であり、クロージャーやその性質のものではありません。

あなたがsetTimer()を開始するには良い条件を持っていると仮定すると、あなたのコードはより次のようになります。

var timer; 

function autoplay() { 
    clearTimeout(timer); //! New code. 
    currentPosition++; 
    if(currentPosition == numberOfSlides) { 
     // last slide 
     currentPosition = 0; 
    } 
    manageNavigation(currentPosition); 

    // Hide/show controls 
    manageControls(currentPosition); 

    // animate the slides 
    slideshowAnimate(); 

    // set timer 
    setTimer(); //! Switched from having multiple startup locations. 
} 
function setTimer() { 
    if(autoplay_enable) { 
     timer = setTimeout(autoplay, interval*1000); //! Removed unnecessary closure. 
    } 
} 

setTimer(); 
+0

私はこのコードが意味論的にのみ異なると思います。元のコードをこのように変更すると、タブ変更後にChromeが失敗し、後でタブに戻ります。 –

+0

実際に追加する必要があるのは、clearTimeoutだけです。あなたのスタートアップ状態に関するいくつかの問題があるようです。私はこのすべてがグローバルであるか、単一のスタートアップクロージャでラップされると期待していますか? –

0

のsetTimeoutのリターンはタイマーの内部認識に使用されるインデックス番号ではなく、実際のタイマー自体。したがって、あなたはタイマーを指しているものを上書きしているだけで、タイマーを再作成するときに実行中のタイマーは削除されません。

コンピューティングパワーを節約するために、クロムエンジンはバックグラウンドタブで実行されているほとんどのJavaScriptをフリーズし、フォーカスが戻ったときに試して「追いつく」ようです。しかし、これはどうしたらいいのか分からない。間違いなくclearTimeoutを使用するか、Timerオブジェクトを使用してこれを反復アクションとして試してみてください。

+0

さて、基本的にChromeの問題ですか? 「追いつく」とは、最終的にアニメーション化することを意味しますか? –

+0

ここにdevチャネルに関するいくつかのコメントがあります:http://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/ff827011f2d1f0f6興味があるかもしれませんが、スロットルは1コールあたり1秒となります。それを殺しているアニメーションの遷移かもしれないし、アニメーションロックのブール値を入れたり、テストのためにアニメーションを取り除いたりしてみてください。 – longstaff

0

小さな修正が見つかりました。あなたは...あなたのコード

var timer; 

にこれを助けることができる

$(window).blur(function() { 
    clearTimeout(timer); 
}).focus(function() { 
    timer= setInterval(autoplay, interval*1000); 
}); 

希望を、これを追加しようとすることができます。