Делает браузер, отслеживают активные setInterval
и setTimeout
Идентификаторы? Или это только до разработчика для отслеживания?
Если это действительно отслеживает их, действительно ли это доступно через BOM?
Разработчик должен отслеживать. Вы можете сделать это, используя возвращаемое значение функции 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, чтобы найти и отменить
Посмотрите на сценарии ниже, браузер может запомнить идентификатор каждой итерации 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]);
}
Это может вас заинтересовать, если вам интересно, как таймер «запоминается» своим окном.
<!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 (и позже №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);
}
Вам просто нужно создать ссылку на переменную для вашего таймера и, если / когда необходимо, очистить ее по имени.
Когда вы загружаете другую страницу, все таймеры автоматически сбрасываются браузером, поэтому вам не нужно поддерживать дескриптор и очищать их, если вам это не нужно / не нужно.