如何在Javascript中同时按下三个键盘时触发事件

How to trigger an event when three keyboards are pressed at the same time in Javascript

我正在编写代码以在按下 ctrl + shift + z 键时执行特定功能。当我同时按下两个键时,它工作正常,但是当我按下三个键时,事件不会发生。下面是我写的代码。

尝试1:

 document.onkeydown = function (e) { 

        if (e.ctrlKey && e.key === 'z') {  // It works
            undo()  // ctrl+ z
           
        }
        else if (e.ctrlKey && e.shiftKey && e.key==='z' ) { //It doesn't work
            redo(); //ctrl + shift + z
        }
    }

尝试2:

document.onkeydown = function (e) { // 
        var ctrl, shift,z
        console.log(e.key)
        switch (e.key) {
            case 'Control':
                ctrl = true;
                break;
            case 'Shift':
                shift = true;
                break;
            case 'Z':
                z = true;
                break;
   
            }
        if (ctrl&&shift&&z) redo()
  }

如果您在三个键盘上打字,这些都不起作用。

如何在按下 ctrl+shift+z 时使其工作

改变条件的顺序,如果第二个条件是true,第一个条件总是true,导致第二个条件的代码永远不会执行。

document.onkeydown = function(e) {
    if (e.ctrlKey && e.shiftKey && e.key === 'Z') {
        undo()
    } else if (e.ctrlKey && e.key === 'Z') {
        redo();
    }
}

我跟踪按下的键的好方法是使用一个对象:

const keys = {}

function onKeyDown(e) {
    keys[e.key.toLowerCase()] = true
    doSomething()
}

function onKeyUp(e) {
    keys[e.key.toLowerCase()] = false
}

window.addEventListener('keydown', onKeyDown)
window.addEventListener('keyup', onKeyUp)

function doSomething() {
    console.log(keys)
    if (keys.control && keys.shift && keys.z) {
        console.log("redo!")
    } else if (keys.control && keys.z) {
        console.log("undo!")
    }
}