如何使按键事件的目标等于 "selected" 元素?

How to make keypress event have the target equal to a "selected" element?

TL;DR: 我如何实现“select”助手,以便一旦集合中的元素被 selected,keypress 事件被触发时 target 等于元素,而不是 body?


我试图让一些元素成为“select可用的”:一旦用户点击其中一个元素,那个元素就会被 selected,而且应该可以使用箭头在它们之间导航。一旦元素被 selected,可能一些热键应该也能与之交互。

我已经实现了第一部分:我有一个 class 和一个助手

var selectClass = 'selectedView';
var selectView = function(element) {
    // remove other selections
    jQuery('.'+selectClass).removeClass(selectClass);
    // select
    jQuery(element).addClass(selectClass);
    //# to do: scroll into view
};

还有点击处理程序:

jQuery(document.body).on('click',viewsSelector,function(ev){
    var viewElement = ev.target;
    // don't select views' children
    while(!jQuery(viewElement).is(viewsSelector) && viewElement.parentElement)
        viewElement = viewElement.parentElement;
    selectView(viewElement);
});

现在我想实现键盘导航。天真的实现

jQuery(document.body).on('keydown','.'+selectClass,function(ev){
    console.log('keydown at selected? key: '+ev.which+', target is ',ev.target);
    //# implement jump
});

不起作用,因为目标是 body(可以通过注释掉委托位 ,'.'+selectClass 轻松检查)。

但我不想处理所有按键,我需要让这些按键仅在 selected 项目时才起作用。作为一种解决方法,我可以添加一个检查项目是否 selected,但是 我想知道是否有办法让事件的目标成为项目本身,而不是 document.body.将 element.focus();jQuery(element).focus(); 添加到 selectView 也无济于事。

为什么我想避免只处理 body 上的按键并检查项目是否 selected 的一个特殊原因是项目中的一些小部件也必须处理这些按键和“在这些情况下不会跳转”。

您的元素未接收键盘事件,因为它在单击时未获得焦点。所有元素在单击时都无法获得焦点,因为它们没有设置 tabindex 焦点标志,但以下元素除外。 [来源:www.w3.org]

  • <a> elements that have an href attribute
  • <link> elements that have an href attribute
  • <button> elements
  • <input> elements whose type attribute are not in the Hidden state
  • <select> elements
  • <textarea> elements
  • Editing hosts
  • Browsing context containers

如果某个元素不在焦点中,键盘事件将由 body 元素接收。

When an element is focused, key events received by the document must be targeted at that element. There may be no element focused; when no element is focused, key events received by the document must be targeted at the body element. [source:www.w3.org]

您可以使任何 HTML 元素能够获得焦点,从而通过添加 tabindex 属性.

来接收键盘事件

$('.box').on('keydown', function(event) {
  console.log(event.target);
})
.box {
  height: 120px;
  width: 120px;
  background: #7cf76e;
  float: left;
  margin: 2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="box" tabindex="1">A</div>
<div class="box" tabindex="1">B</div>
<div class="box" tabindex="1">C</div>