jQuery按键箭头键


74

我正在尝试捕获jQuery中的箭头按键,但是没有事件被触发。

$(function(){
    $('html').keypress(function(e){
        console.log(e);
    });
});

这会为字母数字键生成事件,但是删除,箭头键等不会生成事件。

我没有抓到这些错在做什么?

Answers:


182

您应该使用.keydown()因为.keypress()会忽略“箭头”,以便捕获键类型使用e.which

按结果屏幕进行聚焦(在小提琴屏幕的右下方),然后按箭头键查看其工作情况。

笔记:

  1. .keypress()绝不会使用Shift,Esc和Delete触发,但.keydown()会触发。
  2. 实际上,.keypress()在某些浏览器中将由箭头键触发,但不是跨浏览器,因此使用起来更可靠.keydown()

更有用的信息

  1. 您可以使用.which或者.keyCode事件对象的-某些浏览器将不支持其中的一种,但使用jQuery的安全时使用的,因为两者的jQuery标准化的东西。(我更喜欢.which从来没有问题)。
  2. 要检测ctrl | alt | shift | META带有实际捕获键的按下,您应该检查事件对象的以下属性-如果按下它们,它们将设置为TRUE:
    • event.ctrlKey -Ctrl
    • event.altKey -alt
    • event.shiftKey -换档
    • event.metaKey -META(命令⌘或Windows键
  3. 最后-这是一些有用的键代码(有关完整列表,请参见keycode-cheatsheet):

    • 输入:13
    • 上:38
    • 下:40
    • 右:39
    • 左:37
    • Esc:27
    • 空格键:32
    • Ctrl:17
    • 替代:18
    • 班次:16

6
是的,按键将忽略“箭头”的信息非常有用。谢谢
Hoang Le

1
@Isaac伟大的附加人员编辑了答案+1-注意,它还将映射到Windows Command Key。谢谢。
Shlomi Hassid

使用向下键会导致页面滚动。向事件中添加一个preventDefault()可以防止这种情况。
JSON

28
$(document).keydown(function(e) {
    console.log(e.keyCode);
});

按键事件确实会检测箭头键,但并非在所有浏览器中都可以。因此,最好使用keydown。

这些是您应该在控制台日志中获得的键代码:

  • 左= 37
  • 上= 38
  • 右= 39
  • 下= 40

在chrome上对我不起作用。keydown的工作原理引自api.jquery.com/keypress。 请注意,keydown和keyup提供了一个代码,指示按下哪个键,而keypress指示输入哪个字符。例如,小写的“ a”在按下和按下时将报告为65,但在按下时将报告为97。所有事件都将大写字母“ A”报告为65。由于存在这种区别,在捕获特殊的击键(例如箭头键)时,.keydown()或.keyup()是更好的选择。
Harsha Venkatram

2
按键可能会在某些浏览器中使用箭头键触发,您是对的,但在其他浏览器中的行为会有所不同,因此使用keydown更好。
Shlomi Hassid

我没有提到我仅在Firefox上进行了测试。不,keypress给我显示40和38就像keydown
Christian Heinrichs

8

您可以通过以下方式检查是否按下了箭头键:

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) 
      alert( "arrowkey pressed" );          
});

jsfiddle演示


4
left = 37,up = 38, right = 39,down = 40

$(document).keydown(function(e) {
switch(e.which) {
    case 37:
    $( "#prev" ).click();
    break;

    case 38:
    $( "#prev" ).click();
    break;

    case 39:
    $( "#next" ).click();
    break;

    case 40:
    $( "#next" ).click();
    break;

    default: return;
}
e.preventDefault();

});


感谢您的答复。为了使之成为一个有用的答案,请考虑添加一些解释,以说明您的代码段的功能,正确的原因以及在最初的问题中我做错了什么。
RedBassett

$('html')更改为$(document)并将keypress更改为keydown
Bhaskara Arani

2

请参考JQuery的链接

http://api.jquery.com/keypress/

它说

当浏览器注册键盘输入时,会将keypress事件发送到一个元素。这与keydown事件类似,除了修饰键和非打印键(例如Shift,Esc和Delete)会触发keydown事件,而不会触发keypress事件。取决于平台和浏览器,这两个事件之间可能会出现其他差异。

这意味着您不能在箭头的情况下使用按键。


0
$(document).on( "keydown",  keyPressed);

function keyPressed (e){
    e = e || window.e;
    var newchar = e.which || e.keyCode;
    alert(newchar)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.