我的问题如下:
循环某些json数组的最佳方法是显示一些数据 就像一秒延迟。
下面的一个不起作用,因为它只显示一个消息而不是4个
jQuery.each(data.user, function(index, itemData) {
timerid = setTimeout(function(){showMessage(itemData);}, 1000);
});
function showMessage(message){
$('#status_info').html(message);
clearTimeout(timerid);
}
谢谢,理查德
答案 0 :(得分:4)
请尝试使用setInterval:
var i = 0;
window.setInterval(function() {
$('#status_info').html(data.user[i++]);
i = i == data.user.length ? 0 : i; // loops the interval
}, 1000);
答案 1 :(得分:3)
如果要避免使用setInterval并将调用绑定到列表的长度,则可以创建一个自执行函数来保存当前索引,而不是使用闭包中的索引。闭包中的变量最终将成为每个循环中的最后一个元素,因为循环将在读取setTimeout函数中的变量之前很久完成。
你也在调用clearTimeout函数,在这种情况下对我来说并没有多大意义。
最重要的是,几乎所有的setTimeout都会同时被调用。这将导致所有值在屏幕上闪烁毫秒(或在某些情况下看得太快)。这里的循环并不合适,因为setTimeout函数是异步的。回调系统最适合有限数量的运行,而setInterval系统最适合未知数量的运行。对我来说,你的运行次数应该是jQuery对象中的元素数量(当前通过$ .each()的元素数量)
我建议您执行类似以下问题的一般示例(由于我无法访问您的dom而进行了广泛宣传)。
function showMessage(message){
$('body').html(message);
}
var itemData = [1,2,3,4];
var i = 0;
function idTimer(list, i) {
if (!(i >= 0)) {
i= 0;
}
setTimeout((function(msg){
i++;
return function(){
if(i < list.length){
idTimer(list, i);
}
showMessage(msg);
}
})(list[i]), 1000);
}
idTimer(itemData);
此代码的实时演示可在以下位置找到:http://jsbin.com/ifuqo