onfocus / onblur прогресс - PullRequest
       8

onfocus / onblur прогресс

0 голосов
/ 19 июня 2011

Здравствуйте, я новичок в javascript и сегодня усердно работал над этим и не смог найти решение.Пожалуйста, помогите мне.

<script>
    if (/*@cc_on!@*/false) {
        document.onfocusin = startB;
        document.onfocusout = stopB;
    } else {
        window.onfocus = startB;
        window.onblur = stopB;
    }

var x = 1000;
var y = 1;

function startB() {
    if (x !== 'ok') {
        x = x - y;
        document.form.num.value = x;
        timeoutID=setTimeout("startB()", 1000);
    } 
    if (x == 0) {
        x = 'ok';
        document.form.num.value = x;
    }
}

function stopB() {
clearTimeout(timeoutID);
}
</script>
<body onLoad="startB()">
<form name="form">
<input name="num" size="10" readonly="readonly" type="text"> 
</form>

Когда я открываю эту страницу, она ведет обратный отсчет со значением 1 / сек в обычном режиме, и когда я меняю окно / вкладку, она останавливается, я снова возвращаюсь, это продолжается 1 / сек, вот чтоЯ хочу, но у меня есть большая проблема -> Когда я перехожу по этой ссылке и очень быстро меняю окно / вкладку, она все еще не загружена, она начинает обратный отсчет в состоянии onblur, а когда я возвращаюсь в состояние onfocus, функциячитается дважды и начинает считать 1 / 0,5сек ... удвоение.

Может кто-нибудь помочь мне с этим?Заранее спасибо.

1 Ответ

0 голосов
/ 19 июня 2011

У startB вызов stopB до установки времени ожидания.Измените stopB на:

  if (timeoutID) clearTimeout(timeoutID);

, чтобы, если timeoutID уже был очищен (или еще не установлен), он не выдавал ошибку.

Редактировать

Если вы уйдете со страницы до того, как произойдет событие загрузки, таймер запустится без фокусировки на странице.Если вы отмените тайм-аут перед его установкой (то есть startB всегда вызывает stopB перед вызовом setTimeout), вы не сможете запустить два таймера.

...