3 回答
TA贡献1806条经验 获得超8个赞
使用用户必须按下才能执行此操作的键号创建一个对象:
const KeysEnum = {
"ENTER": 16,
"SHIFT": 13,
}
let keysPressed = {
};
const handleEventShiftAndEnterPress = () => {
console.log ('User Press Shift Enter');
}
window.document.addEventListener ('keydown', function (event) {
keysPressed[event.keyCode.toString()] = true;
if (keysPressed [KeysEnum.SHIFT] && keysPressed [KeysEnum.ENTER]) {
handleEventShiftAndEnterPress ();
keysPressed [KeysEnum.SHIFT] = false;
keysPressed [KeysEnum.ENTER] = false;
}
});
只要你控制击键对象,你就可以随时做和知道每个键的状态,所以很容易做你需要的:)
TA贡献2037条经验 获得超6个赞
你可以e.getModifierState("NumLock") status根据它是 ON 还是 OFF来确定你的条件,因为当它打开时你e.shiftKey是false,如果它关闭你e.shiftKey是true
按Num lock测试
var el = document.getElementById("myInput");
el.addEventListener("keyup", function(e) {
console.log(e.getModifierState("NumLock"))
});
<input type="text" id="myInput" />
TA贡献1810条经验 获得超4个赞
不幸的是,这似乎是 Windows 操作系统的一种限制,我不知道为什么存在这种限制。我在 StackOverflow 上看到过开发人员在其他上下文中遇到同样问题的例子。
现在,这里有一个似乎有效的解决方案。我不喜欢它,我认为我不应该这样做,但这是我能找到的最好的东西。
我发现当 NumLock 开启时,如果我按住 [Shift] 并按下 [Num5],则会在 [Num5] 的 keydown 事件之前立即触发来自 [Shift] 的 keyup 事件。在我的工作站上,如果我获取这两个事件的时间戳,它们将是 5 毫秒或更短的部分。我只是编写了代码来检查这两个时间戳,如果它们相距 10 毫秒或更短,我的应用程序就会响应输入,考虑到用户按住 [Shift] 并按下 [Num5]。
由于此代码在浏览器中运行,我认为其他平台不会有此限制,它仍然会检查事件以指示 [Shift] 被按下。
添加回答
举报