14

わかりました、それで私はこのコードを持っています:

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

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

});

各要素を別の要素に置き換えたいのですが、各置き換えの間に遅延が必要です。

これが機能しない理由がわかりません。1回のタイムアウト後にすべてが置き換えられるだけです。

何か案は?

ありがとう。

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

それはまさにアンディ・マクラゲが書いた方法です。このようなものがあなたを助けることができると思います。

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 に答える