2012-02-28 96 views
1

我有一个计时器设置像这样:clearTimeout在鼠标离开

var timerID; 

$this.hover(function(){ 
    $this.find('.stage_obj').each(function(index){ 
     var current_obj = $(this); 
     timerID = setTimeout(function(){ 
     animate_on_top(current_obj, index);}, parseInt(OS.delay_y_on_set[index],10)); 
     }); 
}, function(){ 
    clearTimeout(timerID); 
}); 

有功能控制上悬停/出动画。定时器可充当延迟(.delay不会在我的情况下工作)。一切工作正常,但计时器没有被取消鼠标退出,仍是起火。以下是实际调用的animation_on函数:

function animate_on_top(current_obj, index){ 
    current_obj.animate(
     {'top':OS.ends_y_set[index]}, 
     {duration:500, queue:false, 
     specialEasing:{'top':'linear'} 
}); 

任何人都有任何想法,为什么setTimeout不取消定时器?谢谢!

回答

1

之所以超时,不清除是因为你设置过他们的each但只能存储(因此清除)一个多超时。您需要存储并清除每个您创建的超时ID。

var timerID = []; 

$this.hover(function(){ 
    $this.find('.stage_obj').each(function(index){ 
     var current_obj = $(this); 
     var currentTimerID = setTimeout(function(){ 
     animate_on_top(current_obj, index);}, parseInt(OS.delay_y_on_set[index],10)); 
     timerID.push(currentTimerID); 
     }); 
}, function(){ 
    for (var i = 0; i < timerID.length; i++) { 
    clearTimeout(timerID[i]); 
    } 
}); 
+0

太神奇了!感谢Jared的快速,简洁和真棒的回应。使完美感:) – Aaron 2012-02-28 19:43:11

0

您使用的是同一个变量的timerId在一个循环中,所以对于每一次迭代,参考被更改为最后一个。

当你清楚,你实际上只清除最后一个,而不是你所创建的参考!

您应该更改您的代码,以传递对象列表来为您的方法animate_on_top()设置动画,而不是独立地为每个对象设置一个计时器。

或者你可以把通过不同setTimout返回引用()调用到一个数组,清除鼠标移出该阵列的所有引用。喜欢的东西:

var timerID = []; 

$this.hover(function(){ 
    $this.find('.stage_obj').each(function(index){ 
     var current_obj = $(this); 
     var timer = setTimeout(function(){ 
     animate_on_top(current_obj, index);}, parseInt(OS.delay_y_on_set[index],10)); 
     }); 
     timerID.push(timer); 
}, function(){ 
    for (var i = 0; i < timerID.length; i++) { 
    clearTimeout(timerID[i]); 
    } 
});