2013-07-13 2 views
0

У меня есть простой сценарий обратного отсчета (jsFiddle).Chrome setTimeout() вопросы времени

var time = 60; 
function countDown(timeLeft){ 
    $("#timeLeft").text(timeLeft); 
    if(timeLeft!=0){ 
     setTimeout(function(){ countDown(--timeLeft); }, 1000); 
    } 
} 
countDown(time); 

По какой-то причине, если я запускаю его в Chrome и сосредоточиться на другой вкладке, таймер в два раза медленнее, чем это должно быть ... Так что, когда я бегу независимый таймер на телефоне в то же время он идет правильно, и когда я снова фокусируюсь на вкладке с помощью своего таймера, он показывает ~ 30 секунд слева. Он отлично работает, когда вкладка, содержащая скрипт, находится в фокусе, она слишком медленная, только когда она открыта в фоновом режиме. Это не происходит в Firefox. Это какая-то странная ошибка, или я делаю что-то неправильно?

+0

http://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs –

ответ

1

Проблема заключается в том, что вы устанавливаете слишком много функций setTimeout, с временем = 60, существует 60 setTimeouts, поэтому они вредят вашей производительности. Вы можете использовать setInterval вместо:

function countDown(timeLeft){ 
var intervalProc = setInterval(function(){ 
    $("#timeLeft").text(timeLeft); 
    timeLeft--; 
    if(timeLeft <= 0){ 
    clearInterval(intervalProc); 
    } 
}) 

} 
+1

Ваше решение помогает, но лишь частично - обратный отсчет теперь ~ 1.5x медленнее вместо ~ 2 ([обновлено jsFiddle] (http://jsfiddle.net/GZsah/2/)). Я предполагаю, что для точных измерений мне придется прибегнуть к ответам из [этого вопроса] (http://stackoverflow.com/questions/5927284/how-can-i-make-setinterval-also-work-when-a-tab -is-inactive-in-chrome) –

+0

Да, вы правы, я только что осознал это! Это похоже на то, что браузер сосет с фоновой петлей. Кроме того, я пытаюсь решить его с веб-работником в html5, он работает безупречно: D – Rikky

Смежные вопросы