2009-07-21 2 views
6

私は毎秒カウントダウンするタイマーを持っています。ユーザーがmyサイトの3〜4つのタブを開くまで有効です。その時点で、最新のタブのタイマーは2倍または3倍になります。私は現在、IE8のバグだけを再現することができます。以前はsetIntervalを使用していましたが、Firefoxでもバグを再現することができました。サイトに複数のタブが開いていると、なぜ私のsetTimeoutがスピードアップするのですか?

私は実際にFBJS(FacebookのJavascript)を使用していますので、いくつかの擬似コードを提供します。

function countDown() { 
    ... 
    setTimeout(function() { countDown() }, 1000);  
} 

countDown(); 

しかし、私が本当に求めているのは、より理論的なことです。私はブラウザがsetIntervalで "キャッチアップ"しようとすることができる知っているが、どのように複数のタブがsetTimeoutのこの動作を引き起こすことができますか?

答えて

5

その状況は非常に奇妙です。どこが理にかなっている唯一のシナリオは、ブラウザがsetIntervalと同じように自己復活しているsetTimeoutsの期間を「スムーズ」にしようとしているところです。実際に実行しているコードは、それぞれ異なるウィンドウのタイマーを混乱させますその他。

それは可能だ場合、私はFacebookが関与特にと、分からないが、興味深いテストはcountDown機能のために、各インスタンスにランダム化された名前を与え、それは同じように、任意の違いをどうかを確認するために、次のようになります。

<?php $timerTag = rand(1, 1000); ?> 
function countDown<?php echo $timerTag ?>() { 
    ... 
    setTimeout(function() { countDown<? php echo $timerTag ?>() }, 1000);  
} 

countDown<?php echo $timerTag ?>(); 

これが観測された振る舞いを変更した場合、私はこれを念頭に置いているシナリオを主張します。 (おそらく問題を解決する方法を提供する)。

+0

うわー、関数にランダム化された名前を付けるのがトリックでした!異なるウィンドウ内のJavaScriptが互いに影響を与える可能性はありますか? – lamplighter

+1

奇妙な、そうじゃない?私は、ブラウザーの機能の中で、名前(おそらくサイト+名前)だけで機能を識別し、別のタブ/ウィンドウを区別しないで、どこかでコードを「スムージング」するようなものでなければならないと思います。本当にどこかでバグ報告の価値があるかもしれません。 – chaos

+0

これはPHPなしの代替ソリューションかもしれません:http://stackoverflow.com/questions/6112671/settimeout-speeds-up-with-multiple-tabs/6112864#6112864 – namuol