Почему мой setTimeout ускоряется, когда на моем сайте открыто несколько вкладок?

У меня есть таймер, который отсчитывает каждую секунду. Он отлично работает, пока пользователь не откроет 3 или 4 вкладки моего сайта, после чего таймер самой новой вкладки удваивается или утраивается. В настоящее время я могу воспроизвести ошибку только в IE8. Раньше я использовал setInterval и мог воспроизвести ошибку и в Firefox.

На самом деле я использую FBJS (Facebook Javascript), поэтому просто приведу псевдокод.

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

countDown();

Однако то, что я действительно ищу, более теоретическое. Я знаю, что браузеры могут попытаться «догнать» setInterval, но как несколько вкладок могут вызвать такое поведение для setTimeout?


person lamplighter    schedule 21.07.2009    source источник


Ответы (1)


Вся эта ситуация очень странная. Единственный сценарий, который приходит на ум, когда это имеет какой-либо смысл, — это когда браузер пытается «сгладить» период самовосстановления setTimeouts, как и для setInterval, и код, который делает это, фактически путает таймеры в разных окнах с каждым разное.

Я не знаю, возможно ли это, особенно с участием Facebook, но интересным тестом было бы дать каждому экземпляру рандомизированное имя для функции countDown и посмотреть, имеет ли это какое-то значение, например:

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

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

Если это меняет наблюдаемое поведение, это свидетельствует в пользу сценария, который я имею в виду. (И, возможно, предлагает способ решения проблемы.)

person chaos    schedule 21.07.2009
comment
Ничего себе, присвоение функциям случайных имен сделало свое дело! Как возможно, что javascript в разных окнах может влиять друг на друга? - person lamplighter; 21.07.2009
comment
Странно, не так ли? Я предполагаю, что это должно быть что-то вроде того, что я говорил, сглаживание кода где-то в кишках браузера, идентифицирующего функции только по имени (ну, возможно, по сайту + имени) и не различая разные вкладки/окна. Возможно, стоит где-нибудь написать об ошибке. - person chaos; 21.07.2009
comment
Это может быть альтернативное решение без PHP: вкладки"> stackoverflow.com/questions/6112671/ - person namuol; 24.05.2011