2009-07-21 8 views
6

Mam zegar, który odlicza co sekundę. Działa to świetnie, dopóki użytkownik nie otworzy 3 lub 4 zakładki mojej witryny, w którym to momencie zegar najnowszej zakładki ma podwójną lub potrójną prędkość. Obecnie mogę tylko odtworzyć błąd w IE8. Wcześniej używałem setInterval i mogłem odtworzyć błąd w Firefoksie.Dlaczego mój setTimeout przyspiesza, gdy mam wiele kart otwartych do mojej witryny?

Używam FBJS (Javascript Facebooka), więc podam tylko pseudokod.

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

countDown(); 

Jednak to, czego naprawdę szukam, jest bardziej teoretyczne. Wiem, że przeglądarki mogą próbować odtwarzać "catch up" z setInterval, ale w jaki sposób wiele zakładek może powodować to zachowanie dla setTimeout?

Odpowiedz

5

Ta cała sytuacja jest bardzo dziwna. Jedynym scenariuszem, który przychodzi na myśl tam, gdzie ma to sens, jest takie, w którym przeglądarka próbuje "wygładzić" okres przywracania setTimeouts, tak samo jak w przypadku setInterval, a kod, który to robi, myląco chroni zegary w różnych oknach inny.

Nie wiem, czy jest to możliwe, zwłaszcza z Facebook zaangażowany, ale ciekawy badanie byłoby dać każdej instancji losową nazwę funkcji countDown i sprawdzić, czy to czyni żadnej różnicy, jak:

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

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

Jeśli to zmienia obserwowane zachowanie, to argumentuje za scenariuszem, który mam na myśli. (I prawdopodobnie zapewnia sposób rozwiązania problemu.)

+0

Wow, dając funkcje losowe nazwy zrobili lewę! Jak to możliwe, że javascript w różnych oknach może wpływać na siebie nawzajem? – lamplighter

+1

Dziwaczne, prawda? Sądzę, że musi to być coś w rodzaju "wygładzania" kodu gdzieś w głębi przeglądarki identyfikującej funkcje tylko po nazwie (no, prawdopodobnie przez stronę + nazwę) i bez rozróżniania między różnymi zakładkami/oknami. Może naprawdę warto gdzieś zgłosić błąd. – chaos

+0

To może być alternatywne rozwiązanie bez PHP: http://stackoverflow.com/questions/6112671/settimeout-speeds-up-with-multiple-tabs/6112864#6112864 – namuol

Powiązane problemy