Подтвердить что ты не робот

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

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

Если он отслеживает их, доступен ли через спецификацию?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы можете добавить такое глобальное отслеживание таймеров, переопределив функции setTimeout/seInterval. В качестве бонуса вы легко добавляете код, когда установлен или выведен таймер, отслеживайте живые таймеры или всплывающие таймеры и т.д.

Например:

timers = {}; // pending timers will be in this variable
originalSetTimeout = window.setTimeout;
// override `setTimeout` with a function that keeps track of all timers
window.setTimeout = function(fu, t) {
    var id = originalSetTimeout(function() {
        console.log(id+" has timed out");
        delete timers[id]; // do not track popped timers 
        fu();
    }, t);
    // track this timer in the `timers` variable
    timers[id] = {id:id,  setAt: new Date(),  timeout: t};
    console.log(id+" has been set to pop in "+t+"ms");
}
// from this point onward all uses of setTimeout will be tracked, logged to console and pending timers will be kept in the global variable "timers".

Ответ 3

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

<!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> 

Ответ 4

Update:

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

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

Я могу только предположить для # 1 (и позже # 2), что OP означает "они отслеживаются" в общем смысле, потому что, поскольку разработчик s/he хотел бы контролировать их.

Короче говоря, да, они отслеживаются (как указано в @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);
}    

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

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

Ответ 5

Посмотрите на сценарии ниже, браузер может запомнить идентификатор каждой итерации 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]);  
 }