现在更新 OP 提供了“真实”代码:
把这个问题:
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
传递给匿名函数 asj
然后超时内j
的代码使用.
.delay()
或者你可以通过使用 jQuery 的方法更简单地做到这一点,注意这不是.delay()
通用的替代品,它仅用于延迟元素的 jQuery 动画队列中的东西:setTimeout()
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()
函数安排一个函数在指定的毫秒数后运行,但随后立即继续执行语句 after setTimeout()
。所以我上面显示的函数运行整个循环,每隔五秒排队五个超时 - 注意指定的延迟如何乘以循环计数器,然后结束 - 在每次延迟后调用排队的函数。
这种“阻塞”功能的缺乏意味着您不能让任何称为change()
等待所有警报的代码在继续之前等待所有警报。如果你需要等待,你需要重构你的代码(也许使用回调函数)以允许 JS 超时的非阻塞性质。