Zasadniczo próbuję przechwycić kolekcję znaczników LI i wstawić tekst, aby zasymulować wygląd kogoś, kto pisze listę rzeczy do zrobienia. Działa, ale zapisuje każdy z elementów listy jednocześnie, zamiast czekać. Czy istnieje prosty sposób na osiągnięcie tego? Mam konfigurację skrzypiec JS tutaj: http://jsfiddle.net/fZpzT/, ale kod wygląda tak. Dzięki.jquery .each czekając na zakończenie funkcji przed kontynuowaniem pętli
function addListItems() {
var str = {
listitem1:'personal background check',
listitem2:'look into my sketchy neighbor',
listitem3:'look up my driving record',
listitem4:'pick up milk',
listitem5:'wash the car'
}
$('.list-container li').each(function(){
var z = $(this).attr('id');
var str2 = str[z];
var delay = 0;
for (var i = 0; i <= str2.length; i++) {
(function(str2){
delay += 100 + Math.floor(Math.random()*11)*6;
setTimeout(function(){
appendStr(str2);
},delay);
})(str2[i])
}
function appendStr(str2) {
$('#'+ z).append(str2);
}
});
}
+1 dla dobrze pisemne pytanie i jsfiddle przykład. Nie jestem pewien od razu, jakie jest to * rozwiązanie *, ale jestem prawie pewien, że problemem jest ** nie ** '.each()', ale raczej użycie 'setTimeout()'. Metoda 'setTimeout()' wykonuje się asynchronicznie, co oznacza, że cała pętla kończy się iteracyjnie (nie jednocześnie), ale kończy się * bardzo szybko *, a następnie funkcje obsługi procedur 'setTimeout' zaczynają działać * po * zakończeniu pętli. – Snixtor
Chciałbym szukać [tutaj] (http://api.jquery.com/category/deferred-object/) na kilka pomysłów, jak połączyć te funkcje za pomocą "odroczonego". – Aesthete
Zgadzam się z wyjaśnieniem Snixtora i dodam, że powinieneś prawdopodobnie pomnożyć wartość opóźnienia zależnie od tego, na której pozycji listy jesteś (możesz użyć "each (funkcja (indeks) {...", aby uzyskać indeks). opóźnienie potrzebne dla pierwszej pozycji, ale możesz opóźnić drugi element o 1 sekundę, 3 na 2 sekundy itp., co dałoby efekt jednego elementu listy dodawanego na sekundę –