使用.each()元素链接setIntervals

时间:2015-12-13 21:11:03

标签: javascript jquery html setinterval

此问题与此Clear all setIntervals

有关

我在每个函数中使用setIntervals,如此,

var allIntervals = [];
$(".elements").each(function() {
    var myInterval = setInterval(function() {
        // code that changes $(this)
    });
   allIntervals.push(myInterval);
});

然后我清除所有间隔

jQuery.each(allIntervals, function(index) {
    window.clearInterval(allIntervals[index]);
});

我现在意识到我想要清除不再存在于DOM中的元素间隔。

那么如何将setIntervals链接到each()元素,然后检查该元素是否仍在DOM中,如果没有,则清除与该元素关联的Interval?

2 个答案:

答案 0 :(得分:3)

您可以将具有超时ID的元素存储在对象中,但是您必须再次检查以查看它是否在DOM中,因为存储的元素没有从变量中神奇地消失,它已经不在DOM中了。

var allIntervals = [];

$(".elements").each(function(i, el) {
    var myInterval = setInterval(function() {
        // stuff
    }, 1000);
   allIntervals.push({id : myInterval, elem : this});
});


$.each(allIntervals, function(index, item) {
    if ( $(document).find(item.elem).length === 0 ) window.clearInterval(item.id);
});

FIDDLE

答案 1 :(得分:0)

使用对象存储信息(将元素和intervalid作为属性),遍历对象并清除DOM元素(如果不可用)的间隔。

$(function() {

  var intervals = [];

  $(".elements").each(function() {
    var myInterval = setInterval(function() {
      // code that changes $(this)
    });
    var obj = new Object();
    obj.element = $(this);
    obj.intervalId = myInterval;

    intervals.push(obj);
  });

  $.each(intervals, function(index, val) {
     console.log(val.element);
     if (val.element.length > 0) {
         window.clearInterval(val.intervalId);
     }
  });
});