Pergunta

Eu tenho um cronômetro que conta a cada segundo. Funciona muito bem até que o usuário abre 3 ou 4 guias do meu site; nesse momento, o timer do mais recente guia é dobrado ou triplo. Atualmente, só posso reproduzir o bug no IE8. Eu já estava usando o SetInterval e também poderia reproduzir o bug no Firefox.

Na verdade, estou usando o FBJS (JavaScript do Facebook), então vou dar um pouco de pseudocódigo.

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

countDown();

No entanto, o que realmente estou procurando é mais teórico. Eu sei que os navegadores podem tentar jogar "Catch Up" com o SetInterval, mas como várias guias podem causar esse comportamento para o Settimeout?

Foi útil?

Solução

Toda essa situação é muito estranha. O único cenário que vem à mente onde faz algum sentido é aquele em que o navegador está tentando "suavizar" o período de auto-reinstalação Settimeouts, o mesmo que para o setInterval, e o código que está fazendo isso realmente confunde timers em janelas diferentes com cada um com cada um outro.

Não sei se é viável, especialmente com o Facebook envolvido, mas um teste interessante seria dar a cada instância um nome randomizado para o countDown Funcionar e veja se isso faz alguma diferença, como:

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

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

Se isso mudar o comportamento observado, isso defende o cenário que tenho em mente. (E possivelmente fornece uma maneira de resolver o problema.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top