使用setInterval的jquery each()方法

4

我有一个包含不同元素的对象,我想使用each()对其进行迭代,然后对当前元素执行操作。因此:

var arts = $("#press-sqs > article");
shuffle(arts);

$(arts).each(function(){
    setInterval(function() {
    // in here perform an action on the current element in 'arts'
    }, 2000);   
}); 

(shuffle()是一个基本的洗牌函数)

我想不出如何将当前元素作为选择器访问并对其执行操作。$(this)$(window)

最后,一旦到达art的末尾,函数需要重新开始迭代并无限循环。

3个回答

9
如果您正在使用setInterval,交换顺序也会得到相同的结果:
setInterval(function() {
    $(arts).each(function(){
         doSomethingWith(this);
    });   
}, 2000);

我认为您并不想在这里做您所想的事情。我猜想您想要:

var i = 0;
setInterval(function() {
    var art = arts[i++];
    doSomethingWith(art)
    if(i >= arts.length) i = 0;
}, 2000); 

聪明的小伙子,你理解了我的意思。我觉得我表达得不是很清楚,但这就是确切的结果。谢谢。 - artparks
1
我不同意交换顺序时结果是“相同的”(元素将按不同的顺序处理),但我敢打赌你关于“真正”的意图是正确的。(编辑:结果证明,你是对的!) - Will Palmer
你能解释一下第二个示例中发生了什么吗? - artparks
@artparks:你遇到了哪个问题?i只是一个数组的索引,每2秒钟递增一次。 - Eric
@WillPalmer:原始案例有定义的顺序吗?我想你可以说不同之处在于顺序是否被定义。 - Eric
显示剩余3条评论

4
jQuery的.each(...)方法会将“当前”元素(以及它的索引)传递到回调函数中。this只是一种方便的方式,当您不需要进行太复杂的操作时可以使用它。
$(arts).each(function(i, current){
    setInterval(function() {
    // in here perform an action on the current element in 'arts'
    }, 2000);   
});

在上面的例子中,当前元素可以在 setInterval 回调函数中使用,例如: current。需要注意的是,元素以“原始”形式传递,就像 this 一样,如果你想在其上调用jQuery方法,你需要以相同的方式包装它,即:$(current)


2

使用它。

$(arts).each(function(){
    var that = this;
    setInterval(function() {
    // in here perform an action on the current element in 'arts'
         doSomethingWith(that)
    }, 2000);   
});

1
似乎不起作用...例如$(that).children(".sq-logo").hide();会隐藏所有具有该类的子元素,而不仅仅是当前正在迭代的元素的子元素。 - artparks
1
@artparks:那是因为你立即迭代了你的元素! - Eric
很可能你真正想要的是在each周围设置一个setInterval,并在每个内部使用一个setTimeout,延迟基于索引。 - Kevin B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接