我基本上试图通过LI标记的集合进行循环,并插入一些文本来模拟某人编写要做的事情列表的外观。它可以工作,但它会同时写入每个列表项,而不是等待。有没有简单的方法来实现这一目标?我有一个JS小提琴安装在这里:http://jsfiddle.net/fZpzT/但代码看起来像这样。谢谢。jquery .each等待函数在继续循环之前完成
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用于阱书面问题和的jsfiddle例子。我不能立即确定*解决方案*是什么,但我很确定问题是**不是**'.each()',而是使用'setTimeout()'。 'setTimeout()'是异步执行的,这意味着整个循环迭代完成(不是同时),但完成*非常快*,然后'setTimeout'函数处理程序在循环结束后开始工作。 – Snixtor 2013-02-13 01:57:54
我会在[这里](http://api.jquery.com/category/deferred-object/)寻找关于如何使用'deferred'链接这些函数的一些想法。 – Aesthete 2013-02-13 02:03:18
我同意Snixtor的解释,并补充说,你应该根据你正在使用的列表项来增加延迟值(你可以使用'each(function(index){...'来获得索引)。第一个项目需要延迟,但是你可以延迟第二个项目1秒,第三个和第二个等等,这会增加每秒添加一个列表项的效果。 – 2013-02-13 02:03:24