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



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)
}

setTimeout就是方法。看见http://jsfiddle.net/scythah/aA6nV/1/作为一个工作示例。

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

现在OP已经提供了"真实"代码,请更新:

放这个的问题:

groopBox.eq(i).slideToggle(1000)

在对处于循环中的setTimeout()的调用中,当所有超时运行时,for循环已经完成,并且i将等于5,并且由于对于.eq(5)没有索引为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()方法,注意.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++) ;

这意味着包含在CCD_ 15中的块不是CCD_。

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

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

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

JavaScript没有"阻塞"暂停或睡眠功能,可以阻止下一行代码在暂停后运行。setTimeout()函数将函数调度为在指定的毫秒数之后运行,但随后立即继续执行setTimeout()之后的语句。因此,我上面展示的函数运行整个循环,每隔五秒排队五次超时——注意指定的延迟是如何乘以循环计数器的,然后结束——每次延迟后,都会调用排队的函数。

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

这就是您想要做的吗?

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秒后,它们全部执行。

这里的问题是,当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)
  };

最新更新