一种重置所有计时器的方法

时间:2014-05-03 12:52:02

标签: javascript timer reset

我的问题是:有没有一种独特的方法来重置计时器而不知道他们在Javascript中的ID?我尝试使用此代码:

var maxId = setTimeout(function(){}, 0);

for(var i=0; i < maxId; i+=1) { 
    clearTimeout(i);
}

我知道这会搜索任何计时器并清除任何计时器,但没有任何反应,我认为当我将它用作书签时,控制台甚至会给我一个错误。此外,计时器的值存储在innerHTML中,如下所示:

<div id="timer">

    <div id="timer-minutes" class="timer-fields">00:00</div>

</div>

1 个答案:

答案 0 :(得分:0)

查看此问题的一种独特方法是覆盖setTimeout的默认功能。通过扩充功能,您可以在页面上使用setTimeout的所有用途。然后,您只需创建一个新方法来清除所有超时。

在下面的代码中,我用自己的版本热线连接内置函数(setTimeout)。只要此代码在页面上的其他脚本之前执行,我就可以跟踪页面上函数的所有调用。也许你甚至可以通过被调用者存储setTimeouts。

(function(win)
{
  var _originalSetTimeout = setTimeout; //Store built-in function
  var timers = []; //Maintain a collection of timers

  win.setTimeout = function(func, delay) //Hijack the built-in function with your own
  {
    var timer = _originalSetTimeout(func, delay); //Invoke the built in
    timers.push(timer);  //Store the timer to your private array
  };

  win.clearAllTimeouts = function()  //Create a new function on the window for resetting all timers
  {
    for(var i=0,length=timers.length;i<length;i++)
      {
        win.clearTimeout(timers[i]);
      }
  };
}(window));

连接此功能后,您可以使用以下代码进行测试:

var x=0;
function Test()
{
  x++;
  console.log('test: ' + x);
  setTimeout(Test, 1000);

  if(x === 5)
  {
    clearAllTimeouts();
    console.log('all timeouts cleared!');
  }
}
Test();

计数器将记录到5,然后一旦它调用clearAllTimeouts()函数。

在此处查看此操作: http://jsbin.com/bulayuro/1/edit