3

我想知道 setInterval() 是否正在发生或被杀死时遇到了问题。我正在创建一个间隔并将其保存到一个变量中:

interval = setInterval('rotate()',3000);

然后单击一个元素,我停止间隔并等待 10 秒,然后再开始一个新的,顺便说一下变量间隔是全局的:

$(elm).click(function(){

  clearInterval(interval);
  position = index;

  $('#banner div').animate({
    'margin-left':position*(-img_width)
  });

  setTimeout('startItnerval()',10000);


});

function startItnerval(){

    interval = setInterval('rotate()',3000);

}

它似乎有效,但最终我可以意识到仍然存在间隔,每次我开始一个新的间隔时,它都会保存在间隔变量中,这是全局的,所以理论上即使我开始 100 个间隔,它们都保存在替换前一个区间的相同变量对吗?所以我应该只有一个间隔实例;然后 clearInterval(interval);它应该停止任何实例。

看结果后,显然即使保存在同一个变量中,它们都是独立的实例,需要单独杀死。

如何跟踪正在执行的时间间隔,并在可能的情况下一一识别它们?即使我能够解决问题,我真的很想知道是否有办法在控制台中计算或显示正在执行的时间间隔?

谢谢

4

2 回答 2

4

jsFiddle Demo

正如评论中所指出的,随着将计时器添加到页面中,id 会不断增加。因此,可能可以清除在页面上运行的所有计时器,如下所示:

function clearTimers(){
 var t = window.setTimeout(function(){
  var idMax = t;
  for( var i = 0; i < idMax; i++ ){
   window.clearInterval(i);
   window.clearTimeout(i);
  }
 },4);
}

之所以只能看到一个区间,是因为每次开始一个新的区间时,都会覆盖 中的值interval。这会导致先前的间隔丢失但仍处于活动状态。

一个建议是只控制对变量的访问。显然有一个问题是 start 函数被过于频繁地调用

clearInterval(interval);//when you clear it, null it
interval = null;

然后再利用它

if( interval != null ){
 interval = setInterval('rotate()',3000);
}

此外,正如 Pointy 在评论中指出的那样,使用字符串调用函数并不是最佳实践。它基本上所做的是将其转换Function为类似于 using 的表达式eval。您可能应该使用函数名称作为回调

setInterval(rotate,3000);

或有一个匿名函数发出回调

setInterval(function(){ rotate(); },3000);
于 2013-05-29T22:48:53.210 回答
2

setInterval返回一个 Id,而不是实际对象,所以不,如果您重复该行,则不会覆盖任何间隔

var xy = setInterval(function() {...}, 1000);

如果要停止间隔,则必须清除它:

clearInterval(xy);

如果您startInterval可以连续多次调用,但您不想创建多个间隔,只需在开始新间隔之前清除 inverval:

function startInterval(){
    clearInterval(interval);
    interval = setInterval('rotate()',3000);
}

如果您必须创建多个间隔,您可以将 id 保存在一个数组中以跟踪它们:

var arr = [];

//set the interval
arr.push(setInterval(...));

//get number of currently running intervals
var count = arr.length //gives you the number of currently running intervals

//clear the interval with index i
clearInterval(arr[i]);
arr.splice(i, 1);
于 2013-05-29T22:51:14.507 回答