在运行循环的每一行时添加暂停

时间:2013-07-03 06:24:23

标签: javascript jquery loops

function change ()
{
    for( var i=0 ; i<5 ; i++) ;
    {     
        alert(5) ;
    }
}

警报5.单击“确定”后,等待5秒,再次发出警报5,等待5.然后执行5次。 但它与setTimeout函数无法正常工作

更新:这是我真正想要做的事情:

var groopBox = $("#"+value.value+" .group") ;
for ( var i=0 ; i<groopBox.length ; i++ ) {
     groopBox.eq(i).slideToggle(1000)
}

这样可行,但当我将此代码块放在setTimeout中时,它不起作用:

var groopBox = $("#"+value.value+" .group") ;
for ( var i=0 ; i<groopBox.length ; i++ ) {
     setTimeout(function(){ groopBox.eq(i).slideToggle(1000) }, i*2000)
}

4 个答案:

答案 0 :(得分:0)

setTimeout就是这样。有关工作示例,请参阅http://jsfiddle.net/scythah/aA6nV/1/

(function () {
    var i = 0;
    change();

    function change() {
        if (i < 5) {
            i++;
            alert(5);
            setTimeout(change, 5000);
        }
    }
})()

答案 1 :(得分:0)

现在更新已提供“真实”代码:

放这个问题:

groopBox.eq(i).slideToggle(1000)

在循环中调用setTimeout()时,所有超时运行时for循环已完成,i将等于5因为5没有索引为.eq(5)的元素,所以没有任何反应。您可以通过引入额外的“包装器”函数来解决这个问题,以便所需的索引最终出现在闭包中:

var groopBox = $("#"+value.value+" .group");
for ( var i=0 ; i<groopBox.length ; i++ ) {
   (function(j) {
      setTimeout(function() { groopBox.eq(j).slideToggle(1000) }, i * 2000);
   })(i);
}

演示:http://jsfiddle.net/BCgkC/

循环的i作为j传递到匿名函数,然后里面的超时使用j

或者你可以通过使用jQuery的.delay() method更简单地做到这一点,注意.delay() setTimeout()的一般替代品,它仅用于用于延迟元素的jQuery动画队列中的东西:

var groopBox = $("#"+value.value+" .group");
for ( var i=0 ; i<groopBox.length ; i++ ) {
   groopBox.eq(i).delay(i * 2000).slideToggle(1000);
}

演示:http://jsfiddle.net/BCgkC/1/

我原来的回答:

请注意,您的代码在此行的末尾有一个不正确的分号:

for( var i=0 ; i<5 ; i++) ;

...这意味着{}中包含的块不属于for循环。

setTimeout()是用于按指定的时间间隔延迟执行JavaScript代码的函数:

function change () {
    for( var i=1 ; i<=5 ; i++)
    {     
        setTimeout(function() { alert(5) }, i * 5000);
    }
}

演示:http://jsfiddle.net/kNvXh/

JavaScript没有“阻塞”暂停或休眠功能,阻止下一行代码在暂停后运行。 setTimeout() function计划在指定的毫秒数后运行的函数,但随后在setTimeout()之后立即继续执行。所以我上面显示的函数运行整个循环,相隔五秒钟排队五次 - 注意指定的延迟如何乘以循环计数器,然后结束 - 在每次延迟后调用排队的函数。

缺少“阻塞”功能意味着您无法在继续之前使用任何名为change()的代码等待所有警报。如果你需要等待,你需要重构你的代码(可能有回调函数),以允许JS超时的非阻塞性。

答案 2 :(得分:0)

这是你想要做的吗?

function myAlert(callback){
  return function(){
    alert(5);
    if(callback){
      setTimeout(callback, 5000);
    }
  }
}

var i = 5, exec;
while(i--)
  exec = myAlert(exec);

exec();

如果您尝试这样做:

var i = 5;
while(i--){
  setTimeout(function(){
    alert(5);
  }, 1000);
}

然后浏览器同时运行所有setTimeouts,所以5秒后,它们全部执行。

答案 3 :(得分:0)

这里的问题是,当setTimeout运行时,for循环将完成,以便i等于它拥有的最后一个值。您可以使用以下任何一种方法捕获/保存每个回调的i值。

您可以使用这样的闭包

  for ( var i=0 ; i<groopBox.length ; i++ ) {
    (function(box){
       setTimeout(function(){ 
          groopBox.eq(box).slideToggle(1000) 
       }, box*2000)
    })(i);

  }

或者你可以使用这样的功能

  for ( var i=0 ; i<groopBox.length ; i++ ) {
    slideBox(i);
  }

  var slideBox = function ( box ) {
     setTimeout(function(){ 
        groopBox.eq(box).slideToggle(1000) 
     }, box*2000)
  };