$ .each()里面的setTimeout

Gre*_*ude 14 each jquery settimeout

好的,所以我有这个代码:

$(this).find('article.loading').each( function(i) {

    var el = this;
        setTimeout(function () {
        $(el).replaceWith($('#dumpster article:first'));
    }, speed);

});
Run Code Online (Sandbox Code Playgroud)

我想用另一个元素替换每个元素但我想在每个替换之间延迟.

我无法弄清楚为什么这不起作用,它只是在一次超时后替换所有这些.

有任何想法吗?

谢谢.

hau*_*ing 19

我只是修改你的代码并进行一些改动.只是一个小技巧.

$(this).find('article.loading').each( function(k, v) {
    var el = this;
        setTimeout(function () {
        $(el).replaceWith($('#dumpster article:first'));
    }, k*speed);
});
Run Code Online (Sandbox Code Playgroud)


And*_*age 17

您循环遍历元素并为每个元素添加一个具有相同配置的计时器.基本上,每个元素都会立即设置一个新的计时器.在所有计时器的第一个刻度上,元素被更新.每个时间间隔相同,因此它们似乎同时更新.

您的逻辑需要以计时器为中心.计时器的每个刻度都需要更新集合中的下一个元素.您不需要每个循环,使用计时器和递增的索引作为循环机制,一旦更新了最后一个元素就停止计时器.

var elements = $(this).find('article.loading');
var index = 0;

setTimeout(function () {
    $(elements).get(index).replaceWith($('#dumpster article:first'));
    index++;
}, speed);
Run Code Online (Sandbox Code Playgroud)

像上面的东西,但记得也停止计时器!

  • 这不应该使用setInterval()而不是setTimeout()吗? (11认同)

RaY*_*ell 16

这正是Andy McCluggage所写的.我觉得这样的事可以帮到你.

var speed = 1000;

// init timer and stores it's identifier so it can be unset later
var timer = setInterval(replaceArticle, speed);

var articles =  $('article.loading');
var length = articles.length;

var index = 0;
function replaceArticle() {
     articles.eq(index).replaceWith($('#dumpster article:first'));

     index++;

     // remove timer after interating through all articles
     if (index >= length) {
         clearInterval(timer);
     }
}
Run Code Online (Sandbox Code Playgroud)