在jQuery中检测单个按键事件上的多个键

rem*_*rsh 42 javascript jquery keypress jquery-events

是否可以结合使用按键的混合物来发射单个事件?

$(document).keyup(function(e){
    if (e.keyCode == 68 && e.keyCode == 69 && e.keyCode == 86) {
        alert('oh hai');
    }
});
Run Code Online (Sandbox Code Playgroud)

我在Chrome中尝试过,但事件并未触发.

叫我疯了,但我正在编写一个Chrome扩展程序,并希望将D+ E+ V键一起推送到隐藏的开发人员模式.

T.J*_*der 73

如果要检测的d,ev按键均下跌的同时,你必须注意既keydownkeyup,并保持地图为down的那些的.当他们全部失败时,解雇你的活动.

例如:Live copy | 资源

var map = {68: false, 69: false, 86: false};
$(document).keydown(function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = true;
        if (map[68] && map[69] && map[86]) {
            // FIRE EVENT
        }
    }
}).keyup(function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = false;
    }
});
Run Code Online (Sandbox Code Playgroud)

我假设你不关心他们被压下的顺序(因为这可能是一种痛苦,可靠地按下),只要他们在某个时刻同时处于同一时间.

  • @Vega:修改键是一个不同的鱼. (3认同)

Par*_*kar 18

与Vega相似......但更简单

var down = {};
$(document).keydown(function(e) {
    down[e.keyCode] = true;
}).keyup(function(e) {
    if (down[68] && down[69] && down[86]) {
        alert('oh hai');
    }
    down[e.keyCode] = false;
});?
Run Code Online (Sandbox Code Playgroud)

  • 这非常好,而且效果很好.如果你需要匹配一系列的键,那么你可以通过推送到一个数组来检查顺序:而不是'down [e.keyCode] = true`,比如说'down.push(e.keyCode)`并改为验证其中:`if(down [68] && down [69] && down [86])`,如下:`if(down [0] === 68 && down [1] === 69 && down [2] === 86) `. (5认同)
  • 我创建了一个[小提琴](http://jsfiddle.net/bplumb/B2efC/1/)来补充lu1s评论. (2认同)

gpl*_*umb 8

也许更简单的组合键会更容易?

Shift + Alt + D怎么样?(您可能不应该使用Control键,因为大多数浏览器已经以某种方式解释Ctrl + D)

这个代码是这样的:

if(e.shiftKey && e.altKey && e.keyCode == 68)
{
  alert('l33t!');
}
Run Code Online (Sandbox Code Playgroud)


小智 6

对于想要避免使用 Jquery 的人,我从TJ Crowder那里得到了纯 javascript 的回答。

//A W S D simultaneously
var map = {65: false, 87: false, 83: false, 68: false};
document.body.addEventListener('keydown', function (e) {
    var e = e || event; //to deal with old IE
    if (e.keyCode in map) {
        map[e.keyCode] = true;
        if (map[65] && map[87]) {
            console.log('up left');
        }else if (map[83] && map[68]) {
            console.log('down right');
        }else if (map[87] && map[68]) {
            console.log('up right');
        }else if (map[83] && map[65]) {
            console.log('down left');
        }
    }
});
document.body.addEventListener('keyup', function (e) {
    if (e.keyCode in map) {
        map[e.keyCode] = false;
    }
});
Run Code Online (Sandbox Code Playgroud)