keypress 和 keyup - 为什么 keyCode 不同?

IT技术 javascript keyboard
2021-03-15 14:25:14

相关:JavaScript KeyCode 与 CharCode

以下是一些您可以在家里或在jsfiddle 中尝试的代码

el.addEventListener( 'keyup', function( e ) { 
    console.log( 'Keyup event' );
    console.log( e.keyCode );
} ); 
el.addEventListener( 'keypress', function( e ) { 
    console.log( 'Keypress event' );
    console.log( e.keyCode );
} );

为什么keyCode不同?

我可以理解为什么应该只使用按键,但我不明白的是,给定键盘上相同的击键,两个键事件如何给出不同的键码。

PS:我不担心旧版浏览器的支持,我在 Chrome 中尝试过这个,很惊讶,但找不到解释。

3个回答

这些事件的目的完全不同。使用keyupkeydown来识别物理键和keypress识别键入的字符。两者是具有不同事件的根本不同的任务;不要试图将两者混合。特别是,keyCodeonkeypress事件通常是多余的,不应使用(旧版 IE 除外,但请参阅下面的链接文档了解更多信息);对于可打印的按键,它通常与which相同charCode,尽管浏览器之间存在一些差异。

Jan Wolter 关于关键事件的文章,已经在另一个答案中链接到,对我来说是关于这个主题的权威词,并且有表格描述了每种不同类型的关键事件和每个浏览器的每个不同属性返回的内容。

我知道目的不同,它不能回答 keyCode 不同的事实,即使是相同的。
2021-04-20 14:25:14
@FlorianMargaine:Jan Wolter 页面上的表格显示了每个属性为每个事件返回的内容。对于WebKit的(和现在确实大多数浏览器),keyCode返回一样which,并charCodekeypress事件,这是对应于字符输入的字符代码,而不是关键中的关键代码按下(因为它是在keyupkeydown)。
2021-04-27 14:25:14
我必须仔细阅读这部分的文章On keydown and keyup events, the keycodes are not character codes, and this conversion will give wild results for many keys. There is no general portable way to convert keycodes to characters. You pretty much have to sense the browser type and base the key mapping on that. I don't have information on keycodes sent by international keyboards.:) 顺便说一句,感谢您的回答!
2021-05-01 14:25:14

quirksmode.org 上有一篇很好的文章回答了这个问题。您可能还想查看Unixpapa 的结果

它们是键盘上的相同键,只是具有不同的修饰符(shift)。Keyup/down 用于击键,keypress 用于键入的文本。
2021-04-20 14:25:14
quirksmode 特别说:for instance, a lower case 'a' and an upper case 'A' have the same keyCode,这就是为什么我不明白。有什么我错过了吗?第二篇文章在相关问题中链接:)
2021-04-21 14:25:14
不,向上和向下应该给出相同的 keyCode,按下应该给出 0。但是 IE、Opera 和看似 Chrome 将按下时的 charCode 作为“keyCode”。
2021-04-28 14:25:14
所以他们应该给出相同的keyCode。他们为什么不取决于事件?
2021-05-11 14:25:14

好吧,当我试图将用户的输入从表单的一个输入复制到表单的其他部分时,我偶然发现了一个不同之处,我已将其锁定以供用户编辑。我发现,每当用户在完成输入后使用 key 移动到下一个标签时,当我使用 eventListener 进行按键时,复制的条目中会丢失最后一个键盘条目,并且使用 keyup 解决了这个问题。

因此,总而言之, Keypress 会侦听按键按下时的状态,不考虑 keypress 的结果,而 keyup 会侦听按键按下后的系统状态并包括按键的结果。