不推荐使用JavaScript keypress
事件:
https://developer.mozilla.org/en-US/docs/Web/API/Document/keypress_event
有人建议完全依靠keydown
事件,例如:
Keydown
是我们唯一需要的键盘事件
https://www.mutuallyhuman.com/blog/2018/03/27/keydown-is-the-only-keyboard-event-we-need/
问题在于keydown
和keypress
不是同义词。至关重要的是,它们在很多/大多数情况下不会返回相同的字符。 Keydown
代表按下键盘上的哪个键,而keypress
代表用户实际键入的字符。
在英语中,区分大小写很重要:
letter = String.fromCharCode(event.which);
按键盘上的键“ a”时,字母keypress
为“ a”,而字母keydown
为“ A”。
使用JCK语言会使情况变得更加复杂,因为keypress
会为国际键盘布局接收正确的字符,而keydown
会将所有内容都转换为单字节字符。
keydown和keyup事件:
https://www.fxsitecompat.com/en-CA/docs/2018/keydown-and-keyup-events-are-now-fired-during-ime-composition/
因此,在弃用keypress
的情况下,考虑到大小写,非ASCII字符和多字节字符,我们在关心用户打算键入的字符时应该使用什么?
相关问题和参考文献:
keyup event always return uppercase letter
=>答案建议使用keypress
。
String.fromCharCode not working on keydown event
=>答案建议使用keypress
。
String.fromCharCode on keypress and keydown are returning wrong characters
=>答案指出keypress
和keydown
事件是不可互换的。
Replacement for deprecated `keypress` DOM event
=>答案建议使用keydown
,而不必注意它在处理字母大小写,非ASCII字符和多字节字符方面的区别。
另外,建议的替代方法beforeinput
似乎没有任何浏览器支持。
Alternative for Keypress Event in Firefox Version 65+
=>该问题已被否决,并建议使用keydown
或beforeinput
进行评论,而无需解决上述任何陷阱。