jQuery .keypress()是否可以同时检测多个键?

有没有办法让jQuery检测到同时按下了多个键?

有没有其他方法可以同时按下两个键来检测?

为了检测被按下的多个键,使用keydownkeyup事件。

 var keys = {}; $(document).keydown(function (e) { keys[e.which] = true; }); $(document).keyup(function (e) { delete keys[e.which]; }); 

我在这里放了一个演示: http : //jsfiddle.net/gFcuU/ 。 这很有趣,虽然我注意到我的键盘最多只能检测6个键。

这取决于。 对于“正常”键,这意味着非ShiftCtrlALT ,( CMD ),答案是否定的,事件处理程序将接连/触发队列中,一个接一个。

对于我上面提到的修饰键,事件对象有一个属性。

例:

 $(document).bind('keypress', function(event) { if( event.which === 65 && event.shiftKey ) { alert('you pressed SHIFT+A'); } }); 

Jsfiddle演示 。

其他特性是:

  • event.ctrlKey
  • event.altKey
  • event.metaKey

如果你只是想在几个按键串联时触发一个处理程序,请尝试如下所示:

 jQuery.multipress = function (keys, handler) { 'use strict'; if (keys.length === 0) { return; } var down = {}; jQuery(document).keydown(function (event) { down[event.keyCode] = true; }).keyup(function (event) { // Copy keys array, build array of pressed keys var remaining = keys.slice(0), pressed = Object.keys(down).map(function (num) { return parseInt(num, 10); }), indexOfKey; // Remove pressedKeys from remainingKeys jQuery.each(pressed, function (i, key) { if (down[key] === true) { down[key] = false; indexOfKey = remaining.indexOf(key); if (indexOfKey > -1) { remaining.splice(indexOfKey, 1); } } }); // If we hit all the keys, fire off handler if (remaining.length === 0) { handler(event); } }); }; 

比如,在st上开火,

 jQuery.multipress([83, 84], function () { alert('You pressed s-t'); }) 

不。 keypress会触发每个按下的按键 – 除了CTRL,ALT和SHIFT等修饰键以外,只要只有一个键, 就可以将其与其他键组合。

由于我的要求过期(没有人使用它:()我决定用更多的2017解决scheme更新答案。

你可以使用我的jquery插件来检测快捷方式。

它基本上caching事件,并得到什么键现在按下。 如果所有按键都被按下,则会触发function。

https://github.com/maciekpaprocki/bindShortcut (过期!)

你有一个小的解释如何在自述文件中使用它。 希望这可以帮助。 反馈不胜感激。

编辑2017年:

这是2017年,我们不需要jQuery插件来解决这样的事情。 总之你需要这样的东西:

 let pressed = {}; document.addEventListener('keydown', (event) => { pressed[event.key] = true; }); document.addEventListener('keyup', (event) => { delete pressed[event.key]; }); //and now write your code document.addEventListener('keydown', (event) => { if(pressed[firstKey]&&pressed[secondKey]){ //dosomething } }); 

旧的浏览器可能有一些怪癖,但从IE9的一切应该工作正常,除了不支持正确的事件委托(超级老Ubuntu等)的边际数量的操作系统。 没有办法解决这个问题,因为这不是浏览器问题。

在新的mac连接到布尔键,如大写locking有一些怪癖。

阅读更多: https : //developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names_and_Char_values