Как очистить все экземпляры setInterval? - PullRequest
2 голосов
/ 12 июля 2011

У меня всегда были проблемы с setInterval:

$('li.item').live('click', function(){ 
    //Need to work with Dyn created object
    //clearInterval(itemClockInterval);
    itemClockInterval = setInterval(function() {
        deconInterval(_this.children('.timeleft'), time);
    }, 1000);
});

Есть несколько li с классом "item".При щелчке функция setInterval обновляет часы, добавленные к этому конкретному li.

Моя проблема заключается в том, что каждый раз, когда щелкают li, часы отсчитывают время в два раза быстрее, чем раньше, потому что работает дополнительный интервал.Мне нужно очистить все экземпляры интервала перед началом нового интервала, но ни одно из моих решений не сработало.

Я прокомментировал одну из вещей, которые я попробовал, видя, что интервал не создается до более позднего периода.это проблематично.

Ответы [ 4 ]

3 голосов
/ 12 июля 2011

Сохранить результат setInterval () для элемента с помощью .data () и очистить его при щелчке.

$('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);
});
2 голосов
/ 12 июля 2011

используйте замыкание:

$('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));
});
1 голос
/ 12 июля 2011

Используйте данные , чтобы сохранить идентификатор интервала, связанный с этим li ...

$('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);
});
0 голосов
/ 12 июля 2011

Или используйте возможность jQuery для отслеживания таймеров для вас, как описано здесь: http://plugins.jquery.com/project/timers. Он автоматически поддерживает связь между объектом jQuery и вашим таймером, поэтому он отслеживает предыдущий таймер, чтобы вы могли очиститьинтервал перед установкой нового.

...