107

我正在尝试使用以下代码在 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”会生成警报。

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

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

代码有什么问题?

4

8 回答 8

115
  1. 使用onkeydown(或onkeyup),而不是onkeypress
  2. 使用keyCode90,而不是 122

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

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

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

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

于 2013-04-15T02:04:22.843 回答
83

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

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

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

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

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

于 2019-05-23T00:11:17.807 回答
9

Ctrl+t也是可能的...只需使用 84 之类的键码

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");
于 2013-07-28T16:11:23.520 回答
6
$(document).keydown(function(e){
  if( e.which === 89 && e.ctrlKey ){
     alert('control + y'); 
  }
  else if( e.which === 90 && e.ctrlKey ){
     alert('control + z'); 
  }          
});

演示

于 2015-11-09T12:40:23.120 回答
3

90 是Z关键,这将进行必要的捕获...

function KeyPress(e){
     // Ensure event is not null
     e = e || window.event;

     if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {
         // Ctrl + Z
         // Do Something
     }
}

根据您的要求,您可能希望e.preventDefault();在 if 语句中添加一个专门执行您的自定义功能的语句。

于 2014-08-01T12:48:55.697 回答
3
document.onkeydown = function (e) {
    var special = e.ctrlKey || e.shiftKey;
    var key = e.charCode || e.keyCode;
  console.log(key.length);
  if (special && key == 38 || special && key == 40 ) { 
    // enter key do nothing
    e.preventDefault();
  }        
}

这是一种阻止两个键的方法,无论是 shift+ 还是 Ctrl+ 组合键。

&& 有助于组合键,没有组合,它会阻止所有 ctrl 或 shift 键。

于 2020-12-04T22:41:24.663 回答
-4

我制作的这个插件可能会有所帮助。

插入

您可以使用此插件,您必须提供要像这样运行的关键代码和功能

simulatorControl([17,90], function(){console.log('You have pressed Ctrl+Z');});

在代码中,我展示了如何执行 for Ctrl+ Z。您将在链接上获得详细文档。插件位于 Codepen 上我的笔的 JavaScript 代码部分。

于 2017-07-06T14:36:24.927 回答
-4

将此代码用于CTRL+ Z。in keypress 的键码Z是 122,CTRL+Z是 26。在控制台区域检查此键码

 $(document).on("keypress", function(e) {
       console.log(e.keyCode);
       /*ctrl+z*/
       if(e.keyCode==26)
       {
          //your code here
       }
    });
于 2017-09-28T20:20:13.157 回答