Поддерживает ли браузер отслеживание активных идентификаторов setInterval
и setTimeout
? Или это зависит только от разработчика, чтобы отслеживать?
Если он отслеживает их, доступен ли через спецификацию?
Поддерживает ли браузер отслеживание активных идентификаторов setInterval
и setTimeout
? Или это зависит только от разработчика, чтобы отслеживать?
Если он отслеживает их, доступен ли через спецификацию?
Разработчик должен отслеживать. Вы можете сделать это, используя возвращаемое значение функции setTimeout/setInterval и передав это значение функции clearTimeout/clearInterval - как описано в других ответах здесь.
Это похоже на то, что каждый браузер будет осуществлять отслеживание интервалов по-своему.
Из w3.org/TR/2009/WD-html5-20090212/no.html(проект, но w3schools и http://w3.org/TR/Window объясните это почти так же) - setTimeout и setInterval возвращают long и clearTimeout/clearInterval принимают длинный поиск и отмена
Вы можете добавить такое глобальное отслеживание таймеров, переопределив функции 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>
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);
}
Вам просто нужно создать ссылку на переменную для своего таймера, а при необходимости, очистить ее по имени.
Когда вы загружаете другую страницу, все таймеры автоматически очищаются браузером, поэтому вам не нужно поддерживать дескриптор и очищать их, если вам не нужно/хотите.
Посмотрите на сценарии ниже, браузер может запомнить идентификатор каждой итерации 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]);
}