2009-07-21 15 views
6

Tengo un temporizador que cuenta hacia atrás cada segundo. Funciona de maravilla hasta que el usuario abre 3 o 4 pestañas de mi sitio, en cuyo punto el temporizador de la ficha más nueva tiene una velocidad doble o triple. Actualmente solo puedo reproducir el error en IE8. Anteriormente estaba usando setInterval, y también podía reproducir el error en Firefox.¿Por qué mi setTimeout se acelera cuando tengo varias pestañas abiertas en mi sitio?

En realidad estoy usando FBJS (Javascript de Facebook), así que solo daré un pseudocódigo.

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

countDown(); 

Sin embargo, lo que realmente estoy buscando es más teórica. Sé que los navegadores pueden probar y jugar "ponerse al día" con setInterval, pero ¿cómo pueden las múltiples pestañas causar este comportamiento para setTimeout?

Respuesta

5

Toda esa situación es muy extraña. El único escenario que viene a la mente en el que tiene algún sentido es uno en el que el navegador intenta "suavizar" el período de autoinicio de setTimeouts, el mismo que para setInterval, y el código que está haciendo eso realmente confunde temporizadores en diferentes ventanas con cada uno otro.

No sé si es posible, especialmente con Facebook involucrado, pero una prueba interesante sería dar a cada instancia de un nombre aleatorio para la función countDown y ver si hay alguna diferencia, como:

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

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

Si esto cambia el comportamiento observado, eso justifica el escenario que tengo en mente. (Y posiblemente proporcione una forma de abordar el problema.)

+0

¡Guau, dar a las funciones nombres aleatorios hizo el truco! ¿Cómo es posible que JavaScript en diferentes ventanas se pueda afectar entre sí? – lamplighter

+1

Bizarre, ¿verdad? Supongo que debe ser algo así como lo que estaba diciendo, "alisar" el código en algún lugar en las entrañas del navegador identificando las funciones solo por nombre (bueno, probablemente por sitio + nombre) y no diferenciando entre las diferentes pestañas/ventanas. Puede valer la pena un informe de error en alguna parte, realmente. – chaos

+0

Esta puede ser una solución alternativa sin PHP: http://stackoverflow.com/questions/6112671/settimeout-speeds-up-with-multiple-tabs/6112864#6112864 – namuol

Cuestiones relacionadas