将多个按键绑定到按键事件

10

我目前使用这个Javascript键盘按键代码来在按键时触发事件:

$(document).keydown(function(e) {
    switch(e.keyCode) {

    case 39:
        e.preventDefault();
        alert("Arrow Key");
        break;

    case 37:
        e.preventDefault();
        alert("Arrow Key");
    }
});

但我想知道的是,我是否可以绑定两个按键的组合,而不是只绑定一个按键。 我能不能做这样的事情:

$(document).keydown(function(e) {
    switch(e.keyCode) { 
        case 39 && 37:
            e.preventDefault();
            alert("Arrow Key");
        break;
    }
});

你的意思是同时按下它们吗?那么你可以查看http://stackoverflow.com/questions/1652210/can-i-intercept-control-a-keypresses-on-ie。 - Halil Özgür
3个回答

26
如果您想同时检查多个键,则应该只使用一个常规按键和一个或多个修饰键(alt/shift/ctrl),因为您无法确定用户键盘上的两个常规按键实际上是否可以同时按下(实际上,它们总是可以被按下,但由于键盘布线的方式,PC可能无法理解)。
您可以使用e.altKey、e.ctrlKey、e.shiftKey字段来检查是否按下了相应的修饰键。
例如:
$(document).keydown(function(e) {
    if(e.which == 98 && e.ctrlKey) {
        // ctrl+b pressed
    }
});

谢谢,我非常感激你的帮助。是的,这实际上更符合我所寻找的。再次感谢。 - mcbeav
完美,完美,完美 - 正是我今天早上正在寻找的!! - JonSnow

3
为什么不使用switch而是使用if
$(document).keydown(function(e) {
    if ((e.keyCode === 37) || (e.keyCode === 39)) {
        e.preventDefault();
        alert("Arrow Key");
    }
});

没错,这样做可以,我不知道为什么我更喜欢使用 switch,但我想这真的无关紧要。再次感谢您的帮助。非常感激。 - mcbeav
我知道这与此帖子无关,但如果您看到了这个,也许您可以在有空的时候帮我解决jQuery LazyLoad插件的问题? - mcbeav
只是好奇,但是你在另一个评论中说“我正在寻找适用于按键组合的解决方案。有什么想法吗?”,那么这怎么可能成为你接受的答案呢? - ThiefMaster

3
你可以使用case fallthrough:
$(document).keydown(function(e) {
    switch(e.which) { 
        case 39:
        case 37:
            e.preventDefault();
            alert("Arrow Key");
            break;
    }
});

请注意,我正在使用e.which而不是e.keyCode以使其在所有浏览器中工作(jQuery自动将实际包含键代码的属性分配给e.which)。

1
不管在哪个浏览器中,对于“keydown”事件,“keyCode”都是正确的属性。也许你想到的是“keypress”事件? - Tim Down
我即将测试这个,但为了确保,这将在按下两个键的组合时触发,对吗? - mcbeav
不,这段代码不是用于“组合键”,而是用于“其中任意一个被按下”。 - Zain Shaikh
我正在寻找适用于组合按键的解决方案。有什么建议吗? - mcbeav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接