【问题标题】:How to clear all setInterval() and setTimeOut() without knowing their ID?如何在不知道 ID 的情况下清除所有 setInterval() 和 setTimeOut()?
【发布时间】:2012-01-07 12:14:23
【问题描述】:

如果我不知道setInterval()setTimeOut()的返回值,我还能用clearInterveral(id)clearTimeOut(id)清除它们吗?

谢谢。

【问题讨论】:

标签: javascript jquery time timeout


【解决方案1】:

您可以像这样替换原来的 setTimeout 和 setInterval:

   setInterval = (function( oldsetInterval){
    var registered=[],
    f = function(a,b){
        return registered[ registered.length ] = oldsetInterval(a,b)
    };
     f.clearAll = function(){
        var r;
        while( r = registered.pop()) { 
           clearInterval( r );
        }       
    };
    return f;    
})(window.setInterval);

现在:

setInterval( function(){alert(5000)}, 5000 );
setInterval( function(){alert(10000)}, 10000 );

setInterval.clearAll();

建议来自@PointedEars 的评论,您不应该使用相同的名称:

reportingSetInterval = as above;
reportingSetInterval( function(){alert(5000)}, 5000 ); 

等等..

【讨论】:

  • window.setTimeout()window.setInterval() 的返回值大部分没有记录(无参考、无标准、封闭源代码),并且可能会更改,因此您的方法不可靠。尝试替换宿主对象的方法是另一个非常糟糕的主意。
  • @PointedEars:现在它是HTML5 specification 的一部分(不一定意味着什么)。
  • 真是个坏主意——为什么?本机函数执行并返回它应该返回的内容,这只是一个小包装器,是这个问题的完美答案。
  • 如果它是一个本地包装器,您需要将它分配给一个已声明的,最好不是该名称的全局变量,否则您将尝试修改主机对象。请参阅 ES 5.1、8.6.2 了解为什么这是一个坏主意。
  • @FelixKling HTML5(明智地)不指定 handle 除了它的类型,并且它在后续调用中必须是唯一的。
【解决方案2】:

您可以为此使用基于注册模式的对象。

【讨论】:

    【解决方案3】:

    据我所知,如果没有原始 ID,这是不可能的,因此将其存储在数组中可能是个好主意

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 2017-08-24
      • 2011-03-22
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2013-04-08
      相关资源
      最近更新 更多