Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在继续循环之前获取SetTimeout以完成_Javascript_Jquery_Loops_Settimeout - Fatal编程技术网

Javascript 在继续循环之前获取SetTimeout以完成

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

我正在尝试使用Javascript/jquery让一行字母逐个亮起。我使用span元素创建了一个数组,并在每个字母上循环,首先将其颜色更改为红色,然后再次更改为黑色。问题是$.each循环函数不会等待setTimeout完成……它会立即循环所有循环,使它们立即变为红色,而不是逐个变为红色。有没有办法解决这个问题?这是我的密码:

JSFiddle:

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