浏览器是否跟踪有效的setInterval
和setTimeout
ID?或者这完全由开发人员来跟踪?
如果它确实跟踪它们,是否可以通过BOM访问?
答案 0 :(得分:4)
开发人员需要跟踪。您可以使用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 :(得分:4)
您可以通过覆盖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".
答案 2 :(得分:1)
如果您对如何通过窗口“记住”计时器感到好奇,这可能会引起您的兴趣。
<!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>
答案 3 :(得分:0)
<强> 更新 强>
这个问题有两个方面。
我只能假设#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);
}
您只需要为计时器创建一个变量引用,如果需要,可以按名称清除它。
当您加载另一个页面时,浏览器会自动清除所有计时器,因此您无需维护句柄,除非您需要/想要清除它们。
答案 4 :(得分:0)
查看下面的脚本,浏览器可以记住每个setTimeout迭代的id
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]);
}