14

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

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

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

});

我想用另一个元素替换每个元素,但我希望每次替换之间有一个延迟。

我不知道为什么这不起作用,它只是在一次超时后替换所有这些。

有任何想法吗?

谢谢。

4

4 回答 4

21

我只是修改您的代码并进行一些更改。只是一个小技巧。

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

PS 此解决方案不是优化解决方案,但它可以帮助您快速完成工作。大多数情况下都很好。就像 jquery 本身一样。

于 2012-11-24T04:38:19.593 回答
18

您正在循环遍历元素并为每个元素添加一个具有相同配置的计时器。本质上,会立即为每个元素设置一个新计时器。在所有计时器的第一个滴答声中,元素被更新。每个的间隔都是相同的,因此它们似乎都在同时更新。

您的逻辑需要以计时器为中心。计时器的每个滴答声都需要更新集合中的下一个元素。您不需要 each 循环,将计时器与递增索引结合使用作为循环机制,在更新最后一个元素后停止计时器。

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

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

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

于 2009-08-13T09:10:13.447 回答
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);
     }
}
于 2009-08-13T09:26:46.470 回答
-1

尝试使用window.setTimeout.

于 2009-08-13T09:08:24.403 回答