显示每个循环从jquery延迟的数据

时间:2009-11-24 20:20:03

标签: jquery loops delay each settimeout

我的问题如下:

循环某些json数组的最佳方法是显示一些数据 就像一秒延迟。

下面的一个不起作用,因为它只显示一个消息而不是4个

jQuery.each(data.user, function(index, itemData) { 


    timerid = setTimeout(function(){showMessage(itemData);}, 1000);
                                                       });

function showMessage(message){
    $('#status_info').html(message);
    clearTimeout(timerid);
}
谢谢,理查德

2 个答案:

答案 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