获取Javascript中所有当前按下的键的列表

And*_*een 6 javascript

在Javascript中,我想写一个返回,当前按下所有键列表的功能(这样我可以允许用户创建自定义快捷键.)有什么办法来获得在Javascript中所有当前按下键的列表?

And*_*een 7

改进上一个答案,我写了一个演示,打印 keydown 和 keyup 上的按键列表。

这是在 jsfiddle 上。

var keys = [];
document.body.innerHTML = "Keys currently pressed: "
window.addEventListener("keydown",
    function(e){
        keys[e.keyCode] = e.keyCode;
        var keysArray = getNumberArray(keys);
        document.body.innerHTML = "Keys currently pressed:" + keysArray;
        if(keysArray.toString() == "17,65"){
            document.body.innerHTML += " Select all!"
        }
    },
false);

window.addEventListener('keyup',
    function(e){
        keys[e.keyCode] = false;
        document.body.innerHTML = "Keys currently pressed: " + getNumberArray(keys);
    },
false);

function getNumberArray(arr){
    var newArr = new Array();
    for(var i = 0; i < arr.length; i++){
        if(typeof arr[i] == "number"){
            newArr[newArr.length] = arr[i];
        }
    }
    return newArr;
}
?
Run Code Online (Sandbox Code Playgroud)


Zet*_*eta 6

  • 只要按下某个键,keydown就会发送一个事件
  • 每当释放一个键时,keyup将触发一个事件

因此,您只需将键保存在一个数组中,然后检查您的组合是否为真.

var keys = [];
window.addEventListener("keydown",
    function(e){
        keys[e.keyCode] = true;
        checkCombinations(e);
    },
false);

window.addEventListener('keyup',
    function(e){
        keys[e.keyCode] = false;
    },
false);

function checkCombinations(e){
    if(keys["a".charCodeAt(0)] && e.ctrlKey){
        alert("You're not allowed to mark all content!");
        e.preventDefault();
    }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是,你应该使用e.key,而不是e.keyCode只要有可能(在这种情况下var key = {},因为e.key是一个字符串).

  • 场景:按住一个键,文档处于焦点,单击URL框,然后释放键.keyup永远不会被触发,但密钥已关闭,导致列表不正确. (7认同)
  • 什么是恶意的?浏览器应该提供按下的键列表.浏览器已经提供了按下的GamePad按钮列表.也许操作系统应该为应用程序提供按键列表. (2认同)
  • @ user3015682:*"`<x>`应该做`<y>`"*可能是一个解决方案,但在这种情况下你需要联系`<x>`的开发人员;). (2认同)
  • @Zeta至少如果您联系操作系统或浏览器,您只需要纠缠2或3个组织,而不是数百万为OS或浏览器平台开发的公司.此外,至少在Windows上,操作系统确实为应用程序提供了键盘状态 - 所以它实际上只是一个浏览器问题.任何时候这种情况发生在基于Windows的PC游戏中,它是游戏本身的愚蠢错误 (2认同)
  • 这个答案绝不是可靠的.例如,当浏览器的焦点被拉开时,操作系统执行此操作的情况并不少见.甚至Chrome也会允许一个页面从另一个页面中提取焦点(例如:日历通知).这将打破基于键盘事件的跟踪.你将有一个永远不会抛出keyup事件的keydown.顺便说一句,问题是如何获得按键列表.从信息中创建这些信息似乎与提出的信息完全不同. (2认同)