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