如果快速完成,热键组合不起作用

时间:2017-07-06 18:25:12

标签: javascript events input keyboard hotkeys

我正在尝试为网络应用制作热键,例如 Ctrl + z 执行撤消功能。

似乎当我快速按下按键时(因为我以前经常使用桌面应用程序),它没有注册。单键按下注册,但由于某种原因它错过了组合。

据我了解,您必须通过按键事件跟踪按下哪些按钮,这是我在下面所做的。

尝试以下代码。点击 Z 输出Z。点击 CTRL 然后 Z 慢慢输出CTRL + Z。点击 CTRL 然后 Z 快速输出Z。当我在Windows的记事本中以相同的速度执行动作时,几乎每次都能完美地工作。

https://codepen.io/samkeddy/pen/YQjgdZ?editors=1010#0

var ctrlPressed=false, altPressed=false;

window.addEventListener("keydown", function (e) {

    hotkey = e;
    if (e.keyCode == 17) ctrlPressed = true;
    if (e.keyCode == 18) altPressed = true;
    e.preventDefault();
});

window.addEventListener("keyup", function (e) {
    hotkey = window.event;

    if (e.keyCode == 17) ctrlPressed = false;
    if (e.keyCode == 18) altPressed = false;

        if (e.keyCode == 90){
          if (altPressed && ctrlPressed && e.keyCode == 90) 
            addText('ALT + CTRL + Z');
          else if (ctrlPressed && e.keyCode == 90) 
            addText('CTRL + Z');
            else 
              addText('Z');
    }
});

//meaningless, just adds text to doc so you can see it
function addText(text) {
  var theDiv = document.getElementById("output");
  theDiv.appendChild(document.createElement("br"));
  var content = document.createTextNode(text);
  theDiv.appendChild(content);
}

1 个答案:

答案 0 :(得分:0)

使用e.ctrlKey检查ctrl是否已关闭而不是变量,只需检查keydown上的热键组合,不要在键盘上执行任何操作。

https://codepen.io/samkeddy/pen/gRdBpq

function KeyPress(e) {
      var evtobj = window.event? event : e
      if (evtobj.keyCode == 90 && evtobj.ctrlKey) addText("CTRL + Z");
  else if (evtobj.keyCode == 90) addText("Z");
}

document.onkeydown = KeyPress;