Браузер отслеживает активные идентификаторы таймера?

Делает браузер, отслеживают активные setInterval и setTimeout Идентификаторы? Или это только до разработчика для отслеживания?

Если это действительно отслеживает их, действительно ли это доступно через BOM?

17
задан Yi Jiang 14 December 2011 в 01:13
поделиться

4 ответа

Разработчик должен отслеживать. Вы можете сделать это, используя возвращаемое значение функции setTimeout / setInterval и передав это значение функции clearTimeout / clearInterval, как описано в других ответах здесь.

Похоже, это связано с тем, что каждый браузер реализует отслеживание интервалов по-своему.

Из w3.org/TR/2009/WD-html5-20090212/no.html (черновик, но w3schools и http://w3.org/TR/Window объясняют это почти одинаково way) - setTimeout и setInterval возвращают long, а clearTimeout / clearInterval принимают long, чтобы найти и отменить

4
ответ дан 30 November 2019 в 14:38
поделиться

Посмотрите на сценарии ниже, браузер может запомнить идентификатор каждой итерации setTimeout

for (i = 1; i <= d; i++) {
          (function(j) {
                var delay = j/d; 
               t[j] = setTimeout(function() {      
                      elem.style.top = j+"px";
                     },delay);

            })(i);           
 } 

Вы можете получить к ним доступ по

for (i in t) {
      alert(t[i]);  
 }
0
ответ дан 30 November 2019 в 14:38
поделиться

Это может вас заинтересовать, если вам интересно, как таймер «запоминается» своим окном.

<!doctype html> 
<html lang= "en"> 
<head> 
<meta charset= "utf-8"> 
<title>Timer </title> 
</head> 
<body>
<h1>Timers</h1>
<script>

if(!window.timers){
    var timers= [], i= 0;
    while(i<5){
        timers.push(setInterval(function(){
            if(confirm(timers.join('\n')+'\nRemove a timer?')){
                clearInterval(timers.shift());
            }
        },
        i*1000+1000));
        ++i;
    }
}
</script>

</body> 
</html> 
1
ответ дан 30 November 2019 в 14:38
поделиться

Обновление:

У этого вопроса есть два аспекта.

  1. Отслеживает ли браузер идентификаторы таймеров?
  2. Доступны ли они

Я могу только предположить для №1 (и позже №2), что OP означает «отслеживаются ли они» в общем смысле, потому что как Разработчик хочет контролировать их.

Короче говоря, да, они отслеживаются (как заметил @s_hewitt, как long значения браузером), и разработчик может управлять ими, сохраняя ссылку на таймеры при настройке.

Как разработчик, вы можете управлять ими (например, останавливать), вызывая ( clearInterval (handleRef) или clearTimeout (handleRef) )

Однако по умолчанию нет ] window.timers или аналогичная коллекция, которая дает вам список существующих таймеров - вам нужно будет поддерживать его самостоятельно, если вы чувствуете, что вам нужно.

function startPolling(delay){
  pollHandle = setInterval(doThis, delay);
}
function stopPolling(){
  clearInterval(pollHandle);
}

function doThisIn30minUnlessStopped(){
  timerHandle = setTimeout(doThisThing, 1800000);
}
function stop30minTimer(){
  clearTimeout(timerHandle);
}    

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

Когда вы загружаете другую страницу, все таймеры автоматически сбрасываются браузером, поэтому вам не нужно поддерживать дескриптор и очищать их, если вам это не нужно / не нужно.

0
ответ дан 30 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: