Мой таймер Javascript отсчитывает слишком быстро или не запускается при загрузке - PullRequest
0 голосов
/ 06 марта 2012

У меня есть счетчик Javascript:

var x=100;
function timerCountdown()
{
    document.getElementById('timer1').value=x;
    x--;
    t=setTimeout("timerCountdown()",1000);

    if (x<-1)
    {
        document.getElementById('timer1').value='Done!';
        clearTimeout(t);
    }   
}

function stopCounter(){
clearTimeout(t);
x=x+1;
}

Затем я использую:

<body onFocus='timerCountdown()' onBlur='stopCounter()'>

Но проблема в том, что обратный отсчет не начинается при загрузке страницы.Он ждет, когда я нажму на другое окно и снова сфокусируюсь на нем.

Итак, я попробовал это:

<body onLoad='timerCountdown()' onFocus='timerCountdown()' onBlur='stopCounter()'>

Но на этот раз обратный отсчет идет довольно быстро.Возможно, потому что timerCOuntdown вызывается дважды каждую секунду.

В качестве альтернативы, я мог бы просто использовать onFocus и onBlur в теге body, но мне нужна функция для запуска Focus при загрузке тела.Это возможно?

У кого-нибудь есть предложения по решению этой проблемы?

спасибо большое!

1 Ответ

0 голосов
/ 06 марта 2012

Простой ответ заключается в том, что setTimeout вызывается дважды, запускается timerCountdown() один раз два раза по отдельности и непрерывно устанавливается два setTimeout идентификатора.

Это было бы то, что вы хотите:

var x = 100;
var t = 0;

function timerCountdown()
{
    if (t == 0) t = setInterval(timerCountdown, 1000);

    document.getElementById('timer1').value=x;
    x--;

    if (x < 0) 
    {
        document.getElementById('timer1').value='Done!';
        clearTimeout(t);
        ticker = 0;
    }
}

function stopCounter()
{
    clearTimeout(t);
    t = 0;
    x++;
}

setInterval гораздо больше подходит для таймеров обратного отсчета, и вещей, которые вам нужно запускать непрерывно, поскольку setTimeout запускается только один раз, и вам нужно продолжать вызывать его.

Редактировать: Это исправляет первоначальный быстрый запуск таймера в Firefox.

Удалите обработчик из <body onload= и добавьте его в конец приведенного выше блока скрипта:

t = setInterval(timerCountdown, 1000);
...