【问题标题】:How to grab keyboard events on an element which doesn't accept focus?如何在不接受焦点的元素上获取键盘事件?
【发布时间】:2011-10-01 18:32:53
【问题描述】:

我知道要处理输入字段中的键盘事件,您可以使用:

$('input').keyup(function(e){
var code = e.keyCode // and 13 is the keyCode for Enter
});

但是,现在,我有一些 divli 元素,而我没有 form 元素,而且我的元素都不被认为是表单元素,它们都不接受 焦点标签之类的东西。

但现在我需要在 div 元素中处理keyup(或keydown,或keypress,没关系)事件。我试过了:

$('div#modal').keyup(function(e){
   if (e.keyCode == 13)
   {
      $('#next').click(); // Mimicking mouse click to go to the next level.
   }
});

但问题是,它不起作用。 我该怎么办?

【问题讨论】:

  • 我不明白你怎么能在没有焦点的元素中捕捉 keyup..
  • 同意 - 需要了解用户将如何使用键盘与非交互式元素进行交互。
  • @kinakuta & @Igor Dymov - 您可以使用tabindex 属性使div 接受焦点。看我的回答。

标签: javascript jquery keyboard keyboard-events


【解决方案1】:

默认情况下,div 无法获得焦点。但是,您可以通过将 tabindex 属性添加到 div 来更改它:

<div tabindex="0" id="example"></div>

然后你可以给div焦点,也可以用hover事件模糊它:

$("#example").hover(function() {
    this.focus();
}, function() {
    this.blur();
}).keydown(function(e) {
    alert(e.keyCode);
});

div 获得焦点时,它将接受键盘事件。你可以看到这个工作的例子here

【讨论】:

  • 您需要 $(this).focus() 来获取 jQuery 对象,而不是 DOM 元素。 .blur() 同上。但是,是的,通过 tabindex 属性,您可以获得关键事件。谢谢!
  • 你,好心的先生,让我很开心!!!不久前放弃了绑定 DIV,直到我遇到了您对这个问题的解决方案!
  • 注意:tabindex=0 表示该元素在顺序键盘导航中应该是可聚焦的,但其顺序由文档的源顺序定义。 (source) 因此,您可以毫无问题地将其分配给多个元素。
【解决方案2】:

有趣的问题。 (这里给你另一个,如何知道 div 有焦点?) 如我所见,您的 div 是一个弹出窗口(它的 id 是dialog)。 这里有一个解决方法:

在弹出窗口打开时:

$("div#modal").data("isOpen", true);

关闭弹窗时:

$("div#modal").data("isOpen", false);

然后,绑定:

$('body').keyup(function(e){  //Binding to body (it accepts key events)
   if($("div#modal").data("isOpen")){  //Means we're in the dialog
       if (e.keyCode == 13) //This keyup would be in the div dialog
       {
          $('#next').click(); // Mimicking mouse click to go to the next level.
       }
   }
});

这样,我们在 div 上模仿 keyup 事件。 希望这可以帮助。干杯

PS:注意可以用#dialog代替div#dialog

【讨论】:

    【解决方案3】:

    我迟到了,但现在确保正确触发事件的正确方法是使用 HTML5 新属性“contenteditable”:

    <div id="myEditableDiv" contenteditable="true"> txt_node </div>
    

    然后可以应用经典的 Js 机制:

    var el = document.getElementById('myEditableDiv');
    el.addEventListener('keypress', function(e){console.log(e.target.innerText);});
    el.addEventListener('keyup', function(e){console.log(e.target.innerText);});
    el.addEventListener('keydown', function(e){console.log(e.target.innerText);});
    

    【讨论】:

    • 为什么要让 div 可编辑?通过设置contenteditable=true,div 内的文本变为可编辑的。我认为您不想这样做只是为了让键盘事件起作用。
    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多