在javascript中捕获ctrl + z组合键

Pau*_*ton 65 javascript combinations ctrl

我试图用这段代码在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>
Run Code Online (Sandbox Code Playgroud)

如果我按住ctrl键并按任何其他键,注释行"test1"将生成警报.

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

在"测试1和2"之后按照线路将它们放在一起,按住ctrl键然后按下z键不会按预期生成警报.

代码有什么问题?

zer*_*kms 84

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

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

为了澄清,密钥代码与字符代码不同.

字符代码用于文本(它们根据编码而不同,但在很多情况下,0-127仍然是ASCII代码).键码映射到键盘上的键.例如,在unicode中,字符0x22909表示?.没有很多键盘(如果有的话)实际上有一把钥匙.

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

  • @PaulJohnston因为**键**代码与**字符**代码不同.字符代码用于文本(它们根据编码而不同,但在很多情况下,0-127仍然是ASCII代码).键码映射到键盘上的键.例如,在unicode字符中,0x22909表示好.没有很多键盘(如果有的话)实际上有一把钥匙.操作系统负责使用用户配置的输入方法将击键转换为字符代码.结果将发送到`keypress`事件.(而`keydown`和`keyup`响应用户按下按钮,而不是键入文本.) (7认同)
  • _为什么keyCode 122不起作用?_好吧,`122`是**F11**键:) (3认同)

laz*_*azd 61

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

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

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

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

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

  • 此外,我想补充一点,自几年前以来,“KeyboardEvent.keyCode”现已被弃用。捕获所有浏览器的最佳方法是首先检查“e.key”,然后回退到“e.keyCode”。或者[你可以使用这个polyfill](https://github.com/cvan/keyboardevent-key-polyfill/) (2认同)

小智 11

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

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");
Run Code Online (Sandbox Code Playgroud)


use*_*190 7

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

演示版