在 JS/jQuery 中绑定箭头键

IT技术 javascript jquery keyboard key-bindings
2021-01-29 16:45:51

如何在 Javascript 和/或 jQuery 中将函数绑定到左右箭头键?我查看了 jQuery 的 js-hotkey 插件(包装内置绑定函数以添加参数以识别特定键),但它似乎不支持箭头键。

6个回答
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

如果需要支持IE8,函数体以e = e || window.event; switch(e.which || e.keyCode) {.


(编辑 2020)
请注意,KeyboardEvent.which现在已弃用。请参阅此示例以KeyboardEvent.key获取更现代的解决方案来检测箭头键。

@MichaelScheper - 1) 变量 != 常量,无论它们是否打算改变......引擎仍然必须将它们当作变量对待,直到 ES6 常量无处不在以至于 jQuery 可以使用常量 2) 数字不是真正神奇的数字,当它们旁边有评论时,它们确切地说明了它们是什么,并且 3) ...继续
2021-03-12 16:45:51
到目前为止最好的答案。e.which像 jQuery 推荐的跨浏览器使用一样,使用e.preventDefault()而不是return falsereturn false在 jQuery 事件处理程序上同时触发e.preventDefault()e.stopPropagation(),其中第二个将导致任何后来添加的事件失败,因为该事件不会传播给它们),并且在开关的末尾,如果它不是正在寻找的任何其他键,则将在调用的e.preventDefault()情况下返回以不妨碍其他键的使用,而不是$.ui.keyCode.DOWN与数字进行比较(快得多)。
2021-03-16 16:45:51
... 3) 当访问$.ui.keyCode.DOWN$在你的词法范围内寻找时,没有找到它,上升一个级别......寻找$,重复直到在全局范围内,在 global 上找到它window$在 windowuiwindow.$访问,keyCode访问,在访问window.$.ui,获得DOWNwindow.$.ui.keyCode去要比较原始值,然后做你的实际比较。无论速度对您来说是否重要是个人决定,我只是倾向于避免 4 级访问,当我可以轻松地编写/评论原语时。
2021-03-26 16:45:51
@NathanArthur 在这里,我找到了两个很好的在线工具来测试键盘键码:keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
2021-03-30 16:45:51
Nathan:似乎并非所有浏览器的键码都是一致的,但箭头键是其中的一些。请参阅此处:stackoverflow.com/questions/5603195/...
2021-04-08 16:45:51
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

字符代码:

37 - 左

38 - 向上

39 - 右

40 - 下

除了 39 也是撇号,不是吗?
2021-03-12 16:45:51
回国有什么目的吗?
2021-03-19 16:45:51
使用 jQuery 时,使用e.which而不是e.keyCode为了更多浏览器支持。请参阅下面的我的评论。
2021-03-20 16:45:51
Shadow:不,他的意思是它会阻止 keydown 事件在其他 DOM 元素上触发
2021-03-25 16:45:51
它停止任何进一步的 keydown 事件被击中。
2021-04-01 16:45:51

您可以使用箭头键的 keyCode(37、38、39 和 40 分别用于向左、向上、向右和向下):

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

这里检查上面的例子

我不确定你对 || 的使用 第 2 行中的运算符。不是零或非零以外的值不是特定于实现且无法保证的吗?我会使用更像: var keyCode = (e.keyCode?e.keyCode:e.which); +1 用于使用箭头对象为案例提供可读的名称。
2021-03-16 16:45:51
如果您使用 jQuery,则不需要测试 e.which:The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
2021-03-24 16:45:51
我试图在桌子上放置一个关键事件监听器,但它不起作用。支持关键事件侦听器的选择器类型是否有限?
2021-04-10 16:45:51

这有点晚了,但是 HotKeys 有一个非常严重的错误,如果您将多个热键附加到一个元素,它会导致事件多次执行。只需使用普通的 jQuery。

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});
+1 用于使用 ui 键码对象。比 37、38、39 或 40 更容易理解。当 jQuery 文档明确指出使用 e.which 来解释浏览器差异时,不确定为什么最佳答案是使用 e.keyCode。希望这个答案能因为做对了而得到更多的认可。
2021-03-27 16:45:51
在每次按键时使用 $.ui.keyCode.DOWN 比使用数字慢很多。如果担心清晰度,只需添加注释,特别是因为每次按下任何键时都必须运行它。
2021-04-02 16:45:51

我只是结合了其他答案中最好的部分:

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});
“ui”从何而来?获取“ TypeError: $.ui is undefined ” 编辑 - 我错过了 JQuery UI。得到了加载 - 没有更多的错误。
2021-03-12 16:45:51
他显然也在使用必须具有该枚举的 jQuery UI。顺便说一句,我不会为此而包含 jQuery UI。
2021-04-05 16:45:51