2009-07-21 6 views
6

Ich habe einen Timer, der jede Sekunde zählt. Es funktioniert gut, bis der Benutzer 3 oder 4 Tabs von meiner Website öffnet, an dem der Timer des neuesten Tabs doppelt oder dreifach geht. Ich kann den Fehler derzeit nur in IE8 reproduzieren. Ich habe zuvor setInterval verwendet und könnte den Fehler auch in Firefox reproduzieren.Warum beschleunigt sich mein setTimeout, wenn mehrere Tabs für meine Site geöffnet sind?

Ich benutze tatsächlich FBJS (Facebook's Javascript), also gebe ich nur einen Pseudocode.

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

countDown(); 

aber was ich wirklich suchen ist mehr theoretischer Natur. Ich weiß, dass Browser versuchen können, mit setInterval "aufzuholen", aber wie können mehrere Registerkarten dieses Verhalten für setTimeout verursachen?

Antwort

5

Diese ganze Situation ist sehr merkwürdig. Das einzige Szenario, das in den Sinn kommt, ist, dass der Browser versucht, den Zeitraum der selbst wiederherstellenden setTimeouts zu "glätten", wie bei setInterval, und der Code, der das tut, verwirrt die Timer in verschiedenen Fenstern andere.

Ich weiß nicht, ob es machbar ist, vor allem mit Facebook beteiligt, aber ein interessanter Test jeder Instanz einen randomisierten Namen für die countDown Funktion und sehen geben würde, wenn das einen Unterschied macht, wie:

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

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

Wenn dies das beobachtete Verhalten ändert, spricht das für das Szenario, das ich im Auge habe. (Und möglicherweise bietet eine Möglichkeit, das Problem anzugehen.)

+0

Wow, gab die Funktionen randomisierten Namen den Trick! Wie ist es möglich, dass sich Javascript in verschiedenen Fenstern gegenseitig beeinflussen kann? – lamplighter

+1

Bizarr, oder? Ich denke, es muss etwas sein, wie ich sagte, "Code" irgendwo im Inneren des Browsers "glätten", die Funktionen nur nach Namen (naja, wahrscheinlich nach Site + Name) identifiziert und nicht zwischen verschiedenen Tabs/Fenstern unterscheidet. Könnte irgendwo einen Fehlerbericht wert sein. – chaos

+0

Dies kann eine alternative Lösung ohne PHP sein: http://stackoverflow.com/questions/6112671/settimeout-speeds-up-with-multiple-tabs/6112864#6112864 – namuol