Javascript 在继续循环之前获取SetTimeout以完成
我正在尝试使用Javascript/jquery让一行字母逐个亮起。我使用span元素创建了一个数组,并在每个字母上循环,首先将其颜色更改为红色,然后再次更改为黑色。问题是$.each循环函数不会等待setTimeout完成……它会立即循环所有循环,使它们立即变为红色,而不是逐个变为红色。有没有办法解决这个问题?这是我的密码: JSFiddle:Javascript 在继续循环之前获取SetTimeout以完成,javascript,jquery,loops,settimeout,Javascript,Jquery,Loops,Settimeout,我正在尝试使用Javascript/jquery让一行字母逐个亮起。我使用span元素创建了一个数组,并在每个字母上循环,首先将其颜色更改为红色,然后再次更改为黑色。问题是$.each循环函数不会等待setTimeout完成……它会立即循环所有循环,使它们立即变为红色,而不是逐个变为红色。有没有办法解决这个问题?这是我的密码: JSFiddle: var数组=$(“.one”); var doIt=函数(){ $.each(数组、函数(索引、值){ array.eq(index.css('co
var数组=$(“.one”);
var doIt=函数(){
$.each(数组、函数(索引、值){
array.eq(index.css('color','red');
setTimeout(函数(){
array.eq(index.css('color','black');
}, 500);
});
};
doIt()代码>
P{
颜色:黑色;
}
你好,我的安娜
设置超时
是异步的。它将立即将控制权返回到调用上下文,因此此代码将无法按预期工作。我建议改为使用setInterval
,它以给定的间隔重复运行相同的函数:
var array = $('.one');
var currentIndex = 0;
var intervalId = setInterval(function(){
array[currentIndex].css('color','black');
currentIndex++;
// We've reached the end of the array, stop calling this function
if (currentIndex == array.length) clearInterval(intervalId);
}, 500);
稍微澄清一下:setInterval
将返回一个ID。然后可以将该ID传递给函数clearInterval
,以停止函数调用。setTimeout
是异步的。它将立即将控制权返回到调用上下文,因此此代码将无法按预期工作。我建议改为使用setInterval
,它以给定的间隔重复运行相同的函数:
var array = $('.one');
var currentIndex = 0;
var intervalId = setInterval(function(){
array[currentIndex].css('color','black');
currentIndex++;
// We've reached the end of the array, stop calling this function
if (currentIndex == array.length) clearInterval(intervalId);
}, 500);
稍微澄清一下:setInterval
将返回一个ID。然后可以将该ID传递给函数clearInterval
,以停止函数调用。setTimeout
是异步的。它将立即将控制权返回到调用上下文,因此此代码将无法按预期工作。我建议改为使用setInterval
,它以给定的间隔重复运行相同的函数:
var array = $('.one');
var currentIndex = 0;
var intervalId = setInterval(function(){
array[currentIndex].css('color','black');
currentIndex++;
// We've reached the end of the array, stop calling this function
if (currentIndex == array.length) clearInterval(intervalId);
}, 500);
稍微澄清一下:setInterval
将返回一个ID。然后可以将该ID传递给函数clearInterval
,以停止函数调用。setTimeout
是异步的。它将立即将控制权返回到调用上下文,因此此代码将无法按预期工作。我建议改为使用setInterval
,它以给定的间隔重复运行相同的函数:
var array = $('.one');
var currentIndex = 0;
var intervalId = setInterval(function(){
array[currentIndex].css('color','black');
currentIndex++;
// We've reached the end of the array, stop calling this function
if (currentIndex == array.length) clearInterval(intervalId);
}, 500);
稍微澄清一下:setInterval
将返回一个ID。然后,您可以将该ID传递给函数clearInterval
,以停止函数调用。这就是您想要的:
这就是你想要的:
这就是你想要的:
这就是你想要的:
以防您需要设置超时解决方案。给你
Html:
Js:
codepen示例:以防需要设置超时解决方案。给你
Html:
Js:
codepen示例:以防需要设置超时解决方案。给你
Html:
Js:
codepen示例:以防需要设置超时解决方案。给你
Html:
Js:
codepen示例:执行此操作时,应正确设置超时。。试着这样设置setTimeout(…,500*(索引+1))。。。。。。。。。。。。现有逻辑中的问题是,它在循环中同时为所有字符设置超时,因此即使技术上是为每个字符单独设置超时,但由于执行速度快,效果无法识别。执行此操作时,应正确设置超时。。试着这样设置setTimeout(…,500*(索引+1))。。。。。。。。。。。。现有逻辑中的问题是,它在循环中同时为所有字符设置超时,因此即使技术上是为每个字符单独设置超时,但由于执行速度快,效果无法识别。执行此操作时,应正确设置超时。。试着这样设置setTimeout(…,500*(索引+1))。。。。。。。。。。。。现有逻辑中的问题是,它在循环中同时为所有字符设置超时,因此即使技术上是为每个字符单独设置超时,但由于执行速度快,效果无法识别。执行此操作时,应正确设置超时。。试着这样设置setTimeout(…,500*(索引+1))。。。。。。。。。。。。现有逻辑中的问题是,它在循环中同时为所有字符设置超时,因此,即使从技术上讲,它分别为每个字符设置超时,但由于执行速度快,效果无法识别。@brennan解决方案更优雅:)@brennan解决方案更优雅:)@brennan解决方案更优雅:)@brennan解决方案更优雅:)酷主意..增加每次循环后的持续时间。谢谢。好主意。增加每次循环后的持续时间。谢谢。好主意。增加每次循环后的持续时间。谢谢。好主意。增加每次循环后的持续时间。谢谢
P {
color:black;
}
var delayBase = 10;
var baseDuration = 500; //Time at which each span stays red for
$(document).ready(function(){
$(".one").each(function(){
flash($(this), delayBase, baseDuration);
delayBase+=1000;
});
});
function flash($element, delay, flashDuration){
//set red
setTimeout(function(){
$element.css('color', 'red');
}, delay );
//set black
setTimeout(function(){
$element.css('color', 'black');
}, (delay+flashDuration) );
}