在JS/jQuery中绑定箭头键

Ale*_*x S 407 javascript keyboard jquery key-bindings

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

Syg*_*ral 529

$(document).keydown(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)
});
Run Code Online (Sandbox Code Playgroud)

在对应casebreak行之间放置箭头键的自定义代码.

e.which由jQuery规范化,因此它适用于所有浏览器.对于纯JavaScript方法,请将前两行替换为:

document.onkeydown = function(e) {
    e = e || window.event;
    switch(e.which || e.keyCode) {
Run Code Online (Sandbox Code Playgroud)


(编辑2017)
如果你觉得很花哨,你可以e.key代替e.whiche.keyCode现在使用.e.key正在成为一个推荐标准,让您核对字符串:'ArrowLeft','ArrowUp','ArrowRight','ArrowDown'.新浏览器原生支持它,请点击此处.

  • 到目前为止最佳答案.使用`e.which`就像jQuery推荐用于跨浏览器一样,使用`e.preventDefault()`而不是`return false`(``return false`对jQuery事件处理程序触发`e.preventDefault()`和`e .stopPropagation()`,第二个将导致任何后来添加的事件失败,因为事件不会传播给它们),并且在开关结束时,将返回*而不调用`e.preventDefault( )`如果它是除了被查找的任何其他键之外没有阻碍其他键使用,而不是`$ .ui.keyCode.DOWN`它与数字相比(更快). (28认同)
  • Nathan:似乎并非所有的密钥代码在浏览器中都是一致的,但箭头键是其中的一些.请看:http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes (2认同)
  • ... 3)当你访问`$ .ui.keyCode.DOWN`时,你在你的词法范围寻找`$`,找不到它,上升到一个等级......寻找`$`,重复到全局范围,在全局`window`上找到它,在窗口上访问`$`,在`window.$`上访问`ui`,在`window.$.ui`上访问`keyCode`,在`window.上访问`DOWN`. ui.keyCode`获取要比较的原始值,然后进行实际比较.无论这种速度对你来说是否重要,都是个人决定,当我遇到可以轻松写入/评论原语的情况时,我只是倾向于避免4级访问. (2认同)

Jos*_*osh 448

$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

字符代码:

37-左

38 - 起来

39 - 对

40 - 下来

  • 使用jQuery时,请使用`e.which`而不是`e.keyCode`来获得更多浏览器支持.请参阅下面的评论. (25认同)
  • 它会阻止任何进一步的keydown事件被击中. (18认同)
  • Shadow:不,他的意思是它阻止了keydown事件在其他DOM元素上触发 (9认同)
  • 回报有什么目的吗? (4认同)
  • 除了39也是撇号,不是吗? (3认同)

CMS*_*CMS 104

您可以使用箭头键的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;
  }
});
Run Code Online (Sandbox Code Playgroud)

这里查看上面的例子.

  • 如果你正在使用jQuery,你不需要测试e.which:`event.which属性规范化event.keyCode和event.charCode` - http://api.jquery.com/event.which/ (6认同)

mac*_*ann 23

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

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • +1用于使用ui keycode对象.比37,38,39或40更容易理解.当jQuery文档明确声明使用e.which来解释浏览器差异时,不确定为什么最佳答案是使用e.keyCode.希望这个答案得到更多的认可,做得对. (2认同)
  • 在每次按键时使用$ .ui.keyCode.DOWN比使用数字慢很多.如果担心清晰度,只需添加注释,尤其是每次按下任何键时都必须运行注释. (2认同)

mat*_*rns 16

我简单地将其他答案的最佳位组合在一起:

$(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();
});
Run Code Online (Sandbox Code Playgroud)

  • 他显然也使用jQuery UI,它必须具有枚举.我不会仅仅为了那个包含jQuery UI,顺便说一句. (2认同)

Rob*_*rst 14

您可以使用KeyboardJS.我为这些任务编写了库.

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });
Run Code Online (Sandbox Code Playgroud)

在这里查看图书馆=> http://robertwhurst.github.com/KeyboardJS/


1''*_*1'' 12

使用普通Javascript的简洁解决方案(感谢Sygmoral的建议改进):

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 39:
            alert('right');
            break;
    }
};
Run Code Online (Sandbox Code Playgroud)

另请参阅/sf/answers/1255030521/.


Pan*_*cus 9

你确定jQuery.HotKeys不支持箭头键吗?我之前用他们的演示搞砸了,当我在IE7,Firefox 3.5.2和谷歌Chrome 2.0.172中进行测试时,观察了左,右,上,下工作......

编辑:看来jquery.hotkeys已经重新定位到Github:https://github.com/jeresig/jquery.hotkeys


小智 5

return false;您可以使用e.preventDefault();哪个相同但更容易理解和阅读,而不是像上面的示例中那样使用.

  • `return false;`和`e.preventDefault();`不完全一样.请参见http://stackoverflow.com/a/1357151/607874 (4认同)