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

StackOverflow https://stackoverflow.com/questions/2814919

Вопрос

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

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

Это было полезно?

Решение

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

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

От w3.org/tr/2009/wd-html5-20090212/no.html (проект, но w3schools и http://w3.org/tr/window. Объясните это почти так же) - Settimeout и Setinterval Возвращение Долгое и чистое время / clearivalerval Примите долго, чтобы найти и отменить

Другие советы

Вы можете добавить такие глобальные таймеры, отслеживающие, переопределив 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".

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

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

Обновлять:

Есть 2 аспекта на этот вопрос.

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

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

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

Как разработчик, который вы можете контролировать (например, остановить) их, позвонив (ClearInterval (HandleRef), или Clearimeout (HandleRef))

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

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

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

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

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

Посмотрите на скрипты ниже, браузер может вспомнить идентификатор каждой итерации 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]);  
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top