2009-07-21 14 views
6

Ho un timer che conta alla rovescia ogni secondo. Funziona benissimo finché l'utente non apre 3 o 4 schede del mio sito, a quel punto il timer della scheda più recente va a velocità doppia o tripla. Attualmente posso riprodurre il bug solo in IE8. In precedenza utilizzavo setInterval e potevo riprodurre il bug anche in Firefox.Perché il mio setTimeout si accelera quando sono aperte più schede sul mio sito?

Attualmente sto usando FBJS (Javascript di Facebook), quindi mi limiterò a dare qualche pseudocodice.

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

countDown(); 

Tuttavia, quello che sto veramente cercando è più teorico. So che i browser possono provare a giocare "catch up" con setInterval, ma in che modo più schede possono causare questo comportamento per setTimeout?

risposta

5

Tutta questa situazione è molto strana. L'unico scenario che viene in mente dove ha senso è quello in cui il browser sta cercando di "attenuare" il periodo di setTimeouts auto-ripristinante, come per setInterval, e il codice che sta facendo in realtà confonde i timer in finestre diverse con ciascuno altro.

Non so se è fattibile, in particolare con Facebook coinvolto, ma un test interessante sarebbe quello di dare ogni istanza un nome randomizzato per la funzione countDown e vedere se questo fa alcuna differenza, come:

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

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

Se questo cambia il comportamento osservato, ciò indica lo scenario che ho in mente. (E probabilmente fornisce un modo per affrontare il problema.)

+0

Wow, dare le funzioni nomi randomizzati ha fatto il trucco! Com'è possibile che JavaScript in finestre diverse possa influenzarsi a vicenda? – lamplighter

+1

Bizzarro, non è vero? Immagino che debba essere qualcosa come stavo dicendo, "levigando" il codice da qualche parte nelle viscere del browser, identificando le funzioni solo per nome (beh, probabilmente per nome + sito) e non differenziando tra schede/finestre diverse. Potrebbe valere un bug report da qualche parte, davvero. – chaos

+0

Questa potrebbe essere una soluzione alternativa senza PHP: http://stackoverflow.com/questions/6112671/settimeout-speeds-up-with-multiple-tabs/6112864#6112864 – namuol

Problemi correlati