43

是否有可能结合组合按键'来触发单个事件?

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

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

说我疯了,但我正在编写一个 Chrome 扩展程序,并希望将D+ E+V键一起推以强制它进入隐藏的开发人员模式。

4

12 回答 12

77

如果您想检测dev键同时全部关闭,您必须同时观察keydownkeyup保留已关闭的地图。当他们都失败时,触发你的事件。

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

我假设您不在乎它们按什么顺序按下(因为可靠地按下会很痛苦),只要它们在某个时间点同时全部按下即可。

于 2012-05-18T15:16:31.203 回答
21

类似于 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;
});​
于 2012-05-18T15:18:48.847 回答
9

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

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

代码是这样的:

if(e.shiftKey && e.altKey && e.keyCode == 68)
{
  alert('l33t!');
}
于 2012-05-18T15:30:41.937 回答
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;
    }
});
于 2018-04-30T16:10:40.283 回答
1

您需要分别捕获三个关键事件并仅在第三个事件之后触发您的操作。

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在一段时间间隔后对其进行扩充以清除标志。

这是一个工作示例


免责声明:我意识到最初的问题是按键应该“一起按下”。这只是一种替代方案,因为其他回答者已经为一起按下的键提供了足够的解决方案。

于 2012-05-18T15:14:42.010 回答
1

我尝试了三个最佳答案(截至这篇文章),但没有一个对我有用。他们没有重置钥匙

如果需要 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/

于 2014-11-14T09:29:03.357 回答
1

一个更现代的解决方案,利用箭头函数休息参数

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>

于 2016-02-07T04:09:05.300 回答
0

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

此代码将让您输入单词“ 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()));
于 2012-05-18T15:15:00.183 回答
0

您应该使用 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
                        }
                    });
于 2012-05-18T15:15:16.613 回答
0

使用此代码可在 100 毫秒后通过多次按键 + 超时触发事件,以防止输入错误。在这个例子中:如果在 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);
});
于 2017-11-16T15:34:46.707 回答
-1

如果您关心订单并且还需要按住一个键并点击另一个键(例如:Shift + DEL、DEL、DEL ...),而无需抬起第一个键以再次触发事件...我修改了 @BlakePlumm 的 [fiddle] 评论,扩展了 @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');
    }
}

摆弄更多精彩的选项和现场演示:- http://jsfiddle.net/kstarr/4ftL1p3k/

于 2014-10-12T18:14:31.883 回答
-1

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

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

我们可以在多次按键时触发一个功能。例如: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();
    });

也许你正在寻找这个。

于 2014-10-23T11:29:36.077 回答