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

是否可以将按键混合组合成单一事件?

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

我已经在Chrome中尝试过,但事件不会触发。

打电话给我疯狂,但我正在写一个Chrome扩展,并希望推D + E + V键在一起,强制它进入隐藏的开发人员模式。

如果您想要检测到dev键同时全部closures,则必须同时观看keydownkeyup并保留已closures的地图。 当他们全都失望时,开启你的事件。

例如: 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; } }); 

我假设你不关心他们按下了什么顺序(因为这是一个痛苦的可靠按),只要他们都在同一时间在一些点。

与维加类似…但更简单

 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; });​ 

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

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

代码是这样的:

 if(e.shiftKey && e.altKey && e.keyCode == 68) { alert('l33t!'); } 

您需要分别捕获三个关键事件,并在第三个关键事件后才开始执行。

 var keys = { d: { code: 100, pressed: false, next: 'e' }, e: { code: 101, pressed: false, next: 'v' }, v: { code: 118, pressed: false, next: 'd' } }, nextKey = 'd'; $(document).keypress(function(e) { if (e.keyCode === keys[nextKey].code) { keys[nextKey].pressed = true; nextKey = keys[nextKey].next; } else { keys.d.pressed = false; keys.e.pressed = false; keys.v.pressed = false; nextKey = 'd'; } if (keys.d.pressed && keys.e.pressed && keys.v.pressed) { alert('Entering dev mode...'); } });​ 

当然有很多方法可以做到这一点。 这个例子并不要求你同时按住键,只要你按顺序键入: d e v

如果你使用了这个,你可能需要增加它以在一定的时间间隔之后清除pressed标志。

这是一个工作的例子 。


免责声明:我知道原来的问题说,钥匙应该“压在一起”。 这只是一个select,因为其他答复者已经提供了足够的解决scheme来将按键压在一起。

我试了三个最好的答案(截至这篇文章),他们都没有为我工作。 他们没有重置密钥

如果用3个键点击脚本,点击一次后按下3个键中的任何一个都会再次点燃。

我刚刚写了这个脚本,工作得很好。 它使用Shift + S来触发,但是你可以很容易的改变它。 按下组合键后会重置。

 var saveArray = new Array(); saveArray[0] = false; saveArray[1] = false; $(document).ready(function(){ $(document).keydown(function (f){ if (f.keyCode == 16) { saveArray[0] = true; } }); $(document).keyup(function (g){ if(g.which == 16){ saveArray[0] = false; } }); $(document).keydown(function (h){ if (h.keyCode == 83) { saveArray[1] = true; if(saveArray[0] == true && saveArray[1] == true){ saveArray[0] = false; saveArray[1] = false; keypressSaveFunction(); } } }); $(document).keyup(function (i){ if (i.which == 83) { saveArray[1] = false; } }); }); function keypressSaveFunction(){ alert("You pressed Shift+S"); } 

小提琴: http : //jsfiddle.net/9m8yswwo/13/

你应该使用keydown和keyup事件来同时处理多于一个的键。

 input.on("keydown", function (e) { if (e.which == 17) { isCtrl = true; // Ctrl return; } /* Ctrl and "c" */ if (isCtrl && e.which == 67) { //some code } }).keyup(function (e) { if (e.which == 17) { isCtrl = false; // no Ctrl } }); 

如果我很好理解:例如小提琴, http : //jsfiddle.net/gAtTk/ (看看你的js控制台)

这段代码会让你input单词“ dev ”(在这个例子中,最后事件keyup被删除)

 (function(seq) { var tmp = seq.slice(); $(document).on("keyup.entersequence", function(e){ if (!(e.keyCode === tmp.pop())) { tmp = seq.slice(); } else { console.log(e.keyCode); if (!tmp.length) { console.log('end'); $(document).off("keyup.entersequence"); } } }); }([68,69,86].reverse())); 

一个更现代的解决scheme,利用箭头function和其余参数的优势:

 const multipleKeypress = (function($document) { // Map of keys which are currently down. const keymap = {} // Update keymap on keydown and keyup events. $document.on( "keydown keyup" // If the key is down, assign true to the corresponding // propery of keymap, otherwise assign false. ,event => keymap[event.keyCode] = event.type === "keydown" ) // The actual function. // Takes listener as the first argument, // rest of the arguments are key codes. return (listener, ...keys) => $document.keydown(() => { // Check if every of the specified keys is down. if (keys.every(key => keymap[key])) listener(event) }) // Pass a jQuery document object to cache it. }($(document))) // Example usage: multipleKeypress(() => console.log("pressed"), 68, 69, 86) // Automatically focus the snippet result window.focus() 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p>Try pressing <kbd>d</kbd>, <kbd>e</kbd> and <kbd>v</kbd> at once.</p> 

使用此代码可以在100ms之后通过多次按键+超时触发事件以防止错误input。 在这个例子中:如果在100ms的时间内按下A,Z,E,事件将被触发。

 var map = {65:false,90:false,69:false}; //Modify keyCodes here $(document).keydown(function(e){ console.log(e.keyCode); map[e.keyCode] = e.keyCode in map ? true : map[e.keyCode] || false; var result = Object.keys(map).filter(function(key){ return map[key]; }).length === Object.keys(map).length ? true : false; if(result){ //Your event here Object.keys(map).forEach(function(key){ map[key] = false; }); } setTimeout(function(){ map[e.keyCode] = false; },100); }); 

如果你关心的顺序,还需要按住一个键,然后点击另一个(例如:Shift + DEL,DEL,DEL …),而不必提起第一个键,让事件再次触发…我修改了@ BlakePlumm的[小提琴]评论,这个评论延伸了@ lu1s对@ ParthThakkar的回答的评论。

此外,使用jQuery的.on()允许您只在某些元素上侦听键序列。 将“body”更改为“input.selector”或其他任何内容。

 var map = []; var down = []; $(document).on('keydown','body', function(e) { if(!map[e.which]){ down.push(e.which); if(down[0] === 68 && down[1] === 69 && down[2] === 86) { console.log('D + E + V'); } else if(down[0] === 16 && down[1] === 46) { console.log('SHIFT + DEL'); } /* more conditions here */ } map[e.which] = true; }).keyup(function(e) { map[e.which] = false; /* important for detecting repeat presses of last key while holding first key(s) (can be shortened. see fiddle) */ var len = down.length; while (len--) { if(down[len] === e.which) down.splice(len,1); //removes only the keyup'd key } $('.alert').html(''); }); 

额外的想法:如果你只关心顺序 – 也就是说,第一个键只需要下来,只要你最后按下主事件触发键(像CTRL + SHIFT + TAB,TAB,TAB的东西),添加这个条件:

 else if(down.length>2) { if($.inArray(68,down)!=-1 && $.inArray(69,down)!=-1 && down[2] === 86) { $('.alert').html('A hacky D+E+V was pressed'); } } 

摆弄更多的光荣select和现场演示: – http://jsfiddle.net/kstarr/4ftL1p3k/

https://github.com/JesseBuesking/jquery.hotkeys.extended

看一下这个。 你可能正在寻找这个。

我们可以在多个按键上触发一个function。 例如:p + t + k

  $(document).hotkeys('p', 't', 'k', function (){ //show blurbox $('#popup').blurbox({ blur: 10, animateBlur: true, bgColor: 'rgba(255,255,0,0.2)' })bb.show(); }); 

也许你正在寻找这个。