Javascript 如何清除setInterval的所有实例?
我一直对setInterval有问题:Javascript 如何清除setInterval的所有实例?,javascript,jquery,setinterval,Javascript,Jquery,Setinterval,我一直对setInterval有问题: $('li.item').live('click', function(){ //Need to work with Dyn created object //clearInterval(itemClockInterval); itemClockInterval = setInterval(function() { deconInterval(_this.children('.timeleft'), time);
$('li.item').live('click', function(){
//Need to work with Dyn created object
//clearInterval(itemClockInterval);
itemClockInterval = setInterval(function() {
deconInterval(_this.children('.timeleft'), time);
}, 1000);
});
有多个类为“item”的li。单击时,setInterval函数将更新附加到该特定li的时钟
我的问题是,每次点击一个li,时钟的倒数速度是以前的两倍,因为额外的间隔正在运行。我需要在新间隔开始之前清除该间隔的所有实例,但我的解决方案都不起作用
我注释掉了我尝试过的一件事情,似乎直到后来才创建间隔,这是有问题的 使用闭包:
$('li.item').live('click', (function(){ //Need to work with Dyn created object
var itemClockInterval;
return function(){
if(itemClockInterval) clearInterval(itemClockInterval);
itemClockInterval = setInterval(function() {
deconInterval(_this.children('.timeleft'), time);
}, 1000);
};
})());
或者,使用jQuery的数据方法:
$('li.item').live('click', function(ev){ //Need to work with Dyn created object
var itemClockInterval = $(ev.target).data("itemClockInterval")
if(itemClockInterval) clearInterval(itemClockInterval);
$(ev.target).data("itemClockInterval", setInterval(function() {
deconInterval(_this.children('.timeleft'), time);
}, 1000));
});
用于存储与该li关联的intervalID
$('li.item').live('click', function(){ //Need to work with Dyn created object
var itemClockIntervalID = $(this).data("itemClockIntervalID");
if (itemClockIntervalID != "undefined") {
clearInterval(itemClockIntervalID);
}
itemClockIntervalID = setInterval(function() { deconInterval(_this.children('.timeleft'), time); }, 1000);
$(this).data("itemClockIntervalID", itemClockIntervalID);
});
使用.data()在元素上存储setInterval()的结果,并在单击时将其清除
$('li.item').live('click', function(){
$this = $(this);
var existing_timer = $this.data('clock');
if (existing_timer){
clearInterval(existing_timer);
}
itemClockInterval = setInterval(function() {
deconInterval($this.children('.timeleft'), time);
}, 1000);
$this.data('clock', itemClockInterval);
});
或者使用jQuery跟踪计时器的功能,如下所述:。它会自动维护jQuery对象和计时器之间的关联,以便跟踪上一个计时器,以便在设置新计时器之前清除间隔 你的问题可能在别处。您在这里定义的
是什么?我不确定你是否正确地构建了整个过程,这就是你遇到问题的原因——不是因为setInterval是邪恶的,它不是邪恶的。嗨,对不起。我省略了一些代码,忘了将_thisvar更改为$(this),我将_this用于代码的另一部分非常有用。其他答案也足够了。我只是想知道。数据总是必须与HTML元素相关联吗?@TaylorMac是的,数据确实必须与元素相关联,尽管您可以使用body
。另一种方法是使用本地存储(cookie、HTML5存储等)。看看