我正在尝试为网络应用制作热键,例如 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);
}
答案 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;