在JavaScript中捕获Ctrl + Z组合键


85

我正在尝试使用以下代码在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按键不会产生预期的警报。

代码有什么问题?

Answers:


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

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

为了明确起见键码与字符码不同。

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

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


1
谢谢,那行得通。为什么onkeypress和keyCode 122不起作用?
Paul Johnston

请问如何在您的解决方案中防止Default()代替警报?我正在测试Ctrl + t。
Surendra Jnawali

@SJnawali:我不确定ctrl+t
zerkms

4
为什么keyCode 122不起作用?好吧,122是按F11键:)
宝贝

7
@PaulJohnston因为密钥代码与字符代码不同。字符代码用于文本(它们的编码因编码而异,但在许多情况下,ASCII代码仍为0-127)。键码映射到键盘上的键。例如,在Unicode字符中,0x22909表示好。实际上,没有多少键盘(如果有的话)具有按键。操作系统负责使用用户配置的输入法将击键转换为字符代码。结果发送到keypress事件。(keydownkeyup响应用户按下按钮,而不输入文本。)
Aidiakapi 2014年

28

对于那些偶然发现此问题的人们,这是完成工作的一种更好的方法:

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

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

此外,使用document.addEventListener意味着您不会让其他听众听到同一事件。

最后,没有理由使用window.event。不鼓励这样做,并可能导致代码脆弱。


此外,我还要补充说,KeyboardEvent.keyCode自几年前以来已不推荐使用。捕获所有浏览器的最佳方法是e.key先检查,然后回退到e.keyCode。或者,您也可以使用这种polyfill
是Barry

9

Ctrl+t也可以...只需将键码设为84,例如

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");

6
$(document).keydown(function(e){
  if( e.which === 89 && e.ctrlKey ){
     alert('control + y'); 
  }
  else if( e.which === 90 && e.ctrlKey ){
     alert('control + z'); 
  }          
});

演示版


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语句中添加一个以专门执行您的自定义功能。


-3

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

插入

您可以使用此插件,您必须提供要运行的关键代码和功能,如下所示

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

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


-5

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

 $(document).on("keypress", function(e) {
       console.log(e.keyCode);
       /*ctrl+z*/
       if(e.keyCode==26)
       {
          //your code here
       }
    });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.