jQuery .keypress()是否可以同时检测多个键?
有没有办法让jQuery检测到同时按下了多个键?
有没有其他方法可以同时按下两个键来检测?
为了检测被按下的多个键,使用keydown
和keyup
事件。
var keys = {}; $(document).keydown(function (e) { keys[e.which] = true; }); $(document).keyup(function (e) { delete keys[e.which]; });
我在这里放了一个演示: http : //jsfiddle.net/gFcuU/ 。 这很有趣,虽然我注意到我的键盘最多只能检测6个键。
这取决于。 对于“正常”键,这意味着非Shift , Ctrl , ALT ,( 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