浏览器是否跟踪活动计时器ID?

时间:2010-05-11 22:37:19

标签: javascript settimeout setinterval

浏览器是否跟踪有效的setIntervalsetTimeout ID?或者这完全由开发人员来跟踪?

如果它确实跟踪它们,是否可以通过BOM访问?

5 个答案:

答案 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. 浏览器是否跟踪计时器ID?
  2. 是否可以访问
  3. 我只能假设#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]);  
 }