在javascript中捕获ctrl z组合键

新手上路,请多包涵

我正在尝试使用以下代码在 javascript 中捕获 ctrl + z 组合键:

 <html>
<head>
    <title>Untitled Document</title>
</head>
<body>

    <script type='text/javascript'>
        function KeyPress(e) {
            var evtobj = window.event? event : e

            //test1 if (evtobj.ctrlKey) alert("Ctrl");
            //test2 if (evtobj.keyCode == 122) alert("z");
            //test 1 & 2
            if (evtobj.keyCode == 122 && evtobj.ctrlKey) alert("Ctrl+z");
        }

        document.onkeypress = KeyPress;
    </script>

</body>
</html>

如果我按住 ctrl 键并按任何其他键,注释行“test1”会生成警报。

如果我按 z 键,注释行“test2”会生成警报。

按照“测试 1 和 2”之后的行将它们放在一起,按住 ctrl 键然后按 z 键不会按预期生成警报。

代码有什么问题?

原文由 Paul Johnston 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答
  1. 使用 onkeydown (或 onkeyup ),而不是 onkeypress
  2. 使用 keyCode 90,而不是 122
 function KeyPress(e) {
      var evtobj = window.event? event : e
      if (evtobj.keyCode == 90 && evtobj.ctrlKey) alert("Ctrl+z");
}

document.onkeydown = KeyPress;

在线演示:http: //jsfiddle.net/29sVC/

澄清一下, 键码与字符代码不同。

字符代码用于文本(它们因编码而异,但在很多情况下 0-127 仍然是 ASCII 代码)。键码映射到键盘上的键。例如,在 unicode 字符 0x22909 中表示好。实际上拥有此键的键盘(如果有的话)并不多。

操作系统负责使用用户配置的输入法将击键转换为字符代码。结果被发送到按键事件。 (而 keydown 和 keyup 响应用户按下按钮,而不是键入文本。)

原文由 zerkms 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于偶然发现这个问题的未来人,这是完成工作的更好方法:

 document.addEventListener('keydown', function(event) {
  if (event.ctrlKey && event.key === 'z') {
    alert('Undo!');
  }
});

使用 event.key 大大简化了代码,删除了硬编码常量。它支持 IE 9+。

此外,使用 document.addEventListener 意味着您不会破坏同一事件的其他侦听器。

最后,没有理由使用 window.event 。积极劝阻它并可能导致脆弱的代码。

原文由 lazd 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题