setTimeout à l’intérieur de $ .each ()

ok, alors j’ai ce code:

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

Je souhaite remplacer chaque élément par un autre, mais je souhaite un délai entre chaque remplacement.

Je n’arrive pas à comprendre pourquoi cela ne fonctionne pas, il les remplace simplement après un délai d’inactivité.

Des idées?

Merci.

Vous parcourez les éléments en boucle et ajoutez une timer à chacun avec la même configuration. Essentiellement, une nouvelle timer est instantanément configurée pour chaque élément. Au premier tick de tous les timers, les éléments sont mis à jour. L’intervalle est le même pour chacun, ils semblent donc tous se mettre à jour en même temps.

Votre logique doit être centrée sur la timer. Chaque tick de la timer doit mettre à jour le prochain élément de la collection. Vous n’avez pas besoin d’une boucle chaque, utilisez le minuteur combiné à un index incrémenté comme mécanisme de bouclage, en l’arrêtant une fois que vous avez mis à jour le dernier élément.

 var elements = $(this).find('article.loading'); var index = 0; setTimeout(function () { $(elements).get(index).replaceWith($('#dumpster article:first')); index++; }, speed); 

Quelque chose comme ci-dessus, mais n’oubliez pas d’arrêter également la timer!

Je viens de modifier votre code et faire un petit changement. Juste un petit truc.

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

C’est exactement comment Andy McCluggage a écrit. Je pense que quelque chose comme ceci pourrait vous aider.

 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); } } 

Essayez avec window.setTimeout .