Javascript 如何清除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);

我一直对setInterval有问题:

$('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存储等)。看看