6

毎秒カウントダウンするタイマーがあります。ユーザーがマイサイトの3つまたは4つのタブを開くまではうまく機能し、その時点で最新のタブのタイマーが2倍または3倍の速度になります。現在、IE8でのみバグを再現できます。以前はsetIntervalを使用していましたが、Firefoxでもバグを再現できました。

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

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

countDown();

しかし、私が本当に探しているのはもっと理論的なものです。ブラウザがsetIntervalで「追いつく」ことを試みることができることは知っていますが、複数のタブがsetTimeoutに対してこの動作を引き起こすにはどうすればよいですか?

4

1 に答える 1

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 ?>();

これが観察された動作を変更する場合、それは私が念頭に置いているシナリオを支持します. (そして、おそらく問題に対処する方法を提供します。)

于 2009-07-21T05:33:46.720 に答える