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
.