【问题标题】:How can I disable all setTimeout events?如何禁用所有 setTimeout 事件?
【发布时间】:2011-04-20 07:32:05
【问题描述】:

我正在使用 ajax 和 asp.net。我有一个 javascript 函数,它使用 setTimeout 创建许多其他 javascript 函数。异步回发发生后,我想禁用所有这些 setTimeouted 事件。我该怎么做?

【问题讨论】:

    标签: javascript asynchronous postback settimeout


    【解决方案1】:

    你可以使用clearTimeout()在另一个函数中停止一个函数的setTimeout()

    var myVar;
    
    function myFunction() {
      myVar = setTimeout(function(){ alert("Hello"); }, 3000);
    }
    
    function myStopFunction() {
      clearTimeout(myVar);
    }
    

    【讨论】:

      【解决方案2】:

      首先,我使用的是这段代码:

      var x = setTimeout('');
      for (var i = 0; i < x; i++)
          clearTimeout(x);
      

      但是,这种代码和平在 Google Chrome 上不起作用。所以我对此做了改进:

      var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared
      for (var i = 0; i <= x; i++)
          clearTimeout(i);
      

      最后,它是一个 hack,正如上面评论中提到的,所以小心使用它。

      编辑:修复循环中使用的错误变量(使用 i 代替 x)

      【讨论】:

        【解决方案3】:

        如果您无法访问设置计时器的代码,尼克的答案可能不起作用,所以我能想到的就是这个 hack。

        这是一个hack,谨慎使用!

        // Set a fake timeout to get the highest timeout id
        var highestTimeoutId = setTimeout(";");
        for (var i = 0 ; i < highestTimeoutId ; i++) {
            clearTimeout(i); 
        }
        

        基本上,它会抓取最高的计时器 id 并清除所有低于此值的内容。 但也可以清除您不想清除的其他计时器!

        【讨论】:

        • 感谢 Vaidotas,我更新了我的设置超时功能,使其对浏览器更加友好
        • +1 这是一个非常方便的 sn-p 粘贴到 Javascript 控制台以关闭所有超时!
        • 这个 hack 确实会导致难以捕捉的错误,因为如果第 3 方库使用 setTimout 和 setInterval 进行初始化,我刚刚发现该库将无缘无故停止工作。
        • 由于计时器 id 的增加,这个 hack 每次都会变慢
        • 这是一个了不起的想法。毕竟,目标是清除所有超时。 +1
        【解决方案4】:

        当您调用setTimeout() 时,请存储计时器 ID,以便您可以清除它。如果您要创建许多超时,那么数组是存储 ID 的好选择。例如:

        var timeouts = [];
        //then, store when you create them
        timeouts.push( setTimeout( { ... }, 1000) );
        

        然后当你想清除它们时:

        for (var i = 0; i < timeouts.length; i++) {
            clearTimeout(timeouts[i]);
        }
        //quick reset of the timer array you just cleared
        timeouts = [];
        

        正如下面的@Robert 所述,如果已经发生超时,clearTimeout() 不会抛出错误,因此这里不存在比赛/计时问题。

        【讨论】:

        • 另外值得注意的是,clearTimeout() 不会在传递无效 ID 的情况下发生异常(如果已经发生超时)。
        • @Robert - 好点子,我倾向于认为这是理所当然的,但我会添加它,以防有任何担忧:)
        • 我想用 javascript 单线程模型认为:在所有情况下,一旦 clearTimeout 完成,就可以保证超时事件不会再次发生。它不在文档中,这是不言而喻的吗?
        【解决方案5】:

        不确定是否可以全局执行此操作,但最常用的方法是使用clearTimeout。您将 setTimeout() 的返回值传递给 clearTimeout(),您可以使用全局变量来存储所有超时变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 2011-07-22
          • 2015-09-11
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          相关资源
          最近更新 更多