javascript - 检测并打印组合键 Javascript

标签 javascript keydown

我目前正在尝试将用户提供的键盘组合转换成它们的可打印版本(例如,如果用户按下 shift + a 我希望能够检测到它并在某处打印字符串“shift + a”,以便用户知道他与操作相关联的组合。

到目前为止,我一直在使用提供的 bool 值:ctrlKey、altKey、shiftKey 和 metaKey,当它们为真时,我将它们的可打印版本添加到最终字符串。

它有效……在某种程度上……

我正确地收到了 ctrl 标志,但是 shift 标志不稳定(在不该换档的时候换档,在应该换档的时候不换档,尽管它对某些键可以正常工作)并且 alt 标志似乎只在少数情况下有效键和元标志似乎根本不起作用。 请注意,我的键盘工作正常,也就是说,这些键在正常情况下按预期工作(shift 键允许我大写,win 键允许我锁定我的电脑,等等......) 另请注意,我的键盘是 azerty。

它在 W3schools 示例中的行为方式相同:

https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_event_key_shiftkey

这是一个例子:

trying with &, which does not require shift on an azerty

trying with 1, which does require shift on an azerty

所以我假设我在检测组合键的方式上存在一些误解。感谢所有愿意提供帮助的人。

function logKey(e) {
    var modifier1;
    var modifier2;
    var modifier3;
    var modifier4;
    var display = "";

    if (e.ctrlKey) {
        modifier1 = "ctrl + ";
    }
    else {
        modifier1 = "";
    }
    if (e.altKey) {
        modifier2 = "alt + ";
    }
    else {
        modifier2 = "";
    }
    if (e.shiftKey) {
        modifier3 = "shift + ";
    }
    else {
        modifier3 = "";
    }      
    if (e.metaKey) {
        modifier4 = "meta + ";
    }
    else {
        modifier4 = "";
    }

    display = modifier1 + modifier2 + modifier3 + modifier4 + e.key

    window.alert(display);
}
window.addEventListener('keydown', logKey);

最佳答案

正如 skyline3000 在他们的评论中暗示的那样,您最好独立跟踪按下了哪些键,然后在需要时查看您跟踪的内容。

像这样:

const input = document.querySelector('input');
const keysDown = [];

input.addEventListener('keydown', e => {
  if (keysDown.indexOf(e.keyCode) === -1) {
    keysDown.push(e.keyCode);
  }
  
  console.log(keysDown);
});

input.addEventListener('keyup', e => {
  const index = keysDown.indexOf(e.keyCode);
  
  if (index !== -1) {
    keysDown.splice(index, 1);
  }
  
  console.log(keysDown, e);
});
Focus on input to register keys:
<input />

这将使您可以更精确地跟踪它们,甚至可以一次跟踪大量按键。

然后,当您想要显示他们按下了哪些键时,您只需打印出您的 keysDown 列表即可。

关于javascript - 检测并打印组合键 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225828/

相关文章:

javascript - 如何应用2个动画?

xcode - 获取 NSTextField 的 keyDown 事件

javascript - 无法用jquery手动触发keydown事件

python - 如何让你的角色移动而不需要反复点击按钮?

javascript - 拆分字符串

javascript - 设置解析对象列表以使用 Angularjs 选择标签

javascript - 使用 Javascript 遍历 sibling 的最快方法是什么?

javascript - 无法使用 Microsoft Graph Api 创建带有 'Objects' 的列表项

javascript - SAPUI5处理对话框中的输入

c# - WPF Key枚举有什么解释吗?