首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jquery中的循环(使用.each()方法)

jquery中的循环(使用.each()方法)
EN

Stack Overflow用户
提问于 2017-02-12 02:09:11
回答 2查看 29关注 0票数 1

为了创建类似钢琴的东西,我编写了以下代码。当您单击一个按钮(#start_img)时,每个.piano div都应该获得press类,在短暂中断之后,它应该再次从其中删除。

然后,该函数应该循环到下一个.piano div,并在那里重复相同的操作。听起来并不太难,唯一的问题是它不工作。有人能给我解释一下代码出了什么问题吗?

代码语言:javascript
复制
$('#start_img').on('click', function() {
  $('.piano').each(function(index) {
    $(this).addClass('press').delay(900).removeClass('press');
  });
});
代码语言:javascript
复制
.press {
  background-color: silver;
}
.piano {
  border: 1px solid black;
  display: inline-block;
  width: 20px;
  height: 60px;
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id='start_img'>Start</button>

<div id='page'>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
  <div class='piano'></div>
</div>

EN

回答 2

Stack Overflow用户

发布于 2017-02-12 02:19:37

有两个原因。

()仅适用于在内部使用动画队列的方法,循环将立即运行,因此会向每个实例添加相同的延迟,使它们都激活

你可以这样做

代码语言:javascript
复制
piano.each(function(index){
   var $el = $(this);
   setTimeout(function(){
       $el.addClass('press');
       setTimeout(function(){
         $el.removeClass('press');
       }, 880);
   }, (index+1) * 900);// multiply delay by index to increment each one
});
票数 1
EN

Stack Overflow用户

发布于 2017-02-12 02:22:01

您可以在特定索引处使用具有延迟的setTimeout。

代码语言:javascript
复制
start.on('click', function() {
  var piano = $('.piano');
  piano.each(function(index) {
    var _this = $(this);
    _this.addClass('press');
    setTimeout(function() {
      _this.removeClass('press');
    }, 900 * index);
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42179392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档