我可以在第二次触发事件时执行不同的代码集吗?

时间:2016-07-31 07:26:05

标签: javascript jquery events triggers keydown

我正在尝试开发一个可以从箭头键导航的菜单,并且在查找“突出显示”第一个元素的初始事件触发器的位置时遇到了一些麻烦。如果你看看我的小提琴,你会发现第一个元素突出显示按下右箭头键时应该突出显示(记得单击小提琴的正文部分!),但我不知道从哪里去这样,随后的按键将循环遍历所有元素。

$(document).ready(function($) {
  $("body").keydown(function(event) {
    if (event.which == 39) {
      $(".a").css({
        "outline": "3px solid red"
      });
    }
  });
});
.tile {
  width: 100px;
  height: 100px;
  outline: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="tile a">
  A
</div>
<div class="tile b">
  B
</div>
<div class="tile c">
  C
</div>

任何提示和反馈都会受到赞赏,即使代码处于完全不同的方向!

3 个答案:

答案 0 :(得分:2)

您应该处理以下所有方向键事件:

$(document).ready(function($) {
  var activeIndex = -1;

  $(".tile").hover(
    function() {
      $(this).css({
        "outline": "3px solid red"
      });
    },
    function() {
      $(this).css({
        "outline": "1px solid red"
      });
    }
  );

  $("body").keydown(function(event) {
    if (event.which == 39) {
      activeIndex = 0;
    } else if (event.which == 38 && activeIndex != -1) {
      activeIndex--;
    } else if (event.which == 40 && activeIndex != -1) {
      activeIndex++;
    }

    if (activeIndex < 0) {
      activeIndex = 0;
    } else if (activeIndex == $("#menu-container").children(".tile").length) {
      activeIndex = $("#menu-container").children(".tile").length - 1;
    }

    if (activeIndex != -1) {
      $("#menu-container").children(".tile").css({
        "outline": "1px solid red"
      });
      $("#menu-container").children(".tile").eq(activeIndex).css({
        "outline": "3px solid red"
      });
    }
  });
});
.tile {
  width: 100px;
  height: 100px;
  outline: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="menu-container">
  <div class="tile a">
    A
  </div>
  <div class="tile b">
    B
  </div>
  <div class="tile c">
    C
  </div>
</div>

答案 1 :(得分:1)

按箭头时,您可以检查当前活动的菜单项,删除其高级样式并将其添加到下一个项目。

像这样:

  if (event.which == 39) {
    var active_title = $('.tile.active');
    active_title.removeClass('active');
    if ( active_title.length && active_title.next().length) {
      active_title.next().addClass('active');
    } else {
        $('.a').addClass('active');
    }
  }

试试https://jsfiddle.net/1kf34rdq/11/

答案 2 :(得分:0)

需要一些标志

$(document).ready(function($) {
    var arrowPressed = false;
    $("body").keydown(function(event){
      if (event.which == 39) {
        if( !arrowPressed ) {
            $(".a").css({"outline":"3px solid red"});
            arrowPressed = true;
        }
        else {
            $(".a").css({"outline":"none"});
            arrowPressed = false;
        }
       }
     });
});