Отслеживает ли браузер активные идентификаторы таймера? - PullRequest
17 голосов
/ 12 мая 2010

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

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

Ответы [ 5 ]

4 голосов
/ 28 октября 2012

Такое глобальное отслеживание таймеров можно добавить, переопределив функции 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".
4 голосов
/ 12 мая 2010

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

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

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

1 голос
/ 12 мая 2010

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

<!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> 
0 голосов
/ 12 мая 2010

Посмотрите на скрипты ниже, браузер может запомнить идентификатор каждой итерации 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 голосов
/ 12 мая 2010

Обновление:

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

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

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

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

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

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

...