在 getEventKey
和 DOM3 键盘事件规范(以及 Firefox 实现的内容)之间存在一些不一致之处:
- 在
keydown
和keyup
事件上,key
属性未正确设置为可打印字符。这在 Firefox 中可以正常工作,我的标准解释是 Firefox 的行为是正确的。来自规范: - 如果键生成可打印字符,并且存在适当的 Unicode 码位,则 KeyboardEvent.key 属性必须是一个由该字符的 char 值组成的字符串。
- 在 Firefox 中,Enter 键仅触发 keydown,但在 Chrome 中触发 keydown 和 keypress。这应该在各个浏览器中保持一致
- 当 CapsLock 键从开启状态切换到关闭状态时,仅触发 keydown 事件。当 CapsLock 从开启状态切换到关闭状态时,不会触发 keydown 事件(这可能是 Chrome 中的浏览器限制)
复现方法:在 Firefox 中测试此页面,并将结果与 Chrome 进行比较:http://jsfiddle.net/63ycmLhe/1/
6条答案
按热度按时间iq0todco1#
kyvafyod2#
我不太确定https://github.com/facebook/react/blob/master/src/browser/ui/dom/getEventKey.js#L103 的注解是什么意思,因为它对我来说并不是很清楚。这是否意味着
keyCode
根据键盘布局而变化?无论如何,如果我们不想在
keydown
和keyup
中的key
属性中包含可打印字符,我们应该在所有浏览器中始终这样做,并在适当的时候对事件进行规范化。目前,Firefox 和 Chrome 在这里的行为是不同的。njthzxwz3#
@Daniel15
keyCode
指的是“虚拟键码”,即键盘上按键的ID。从技术上讲,除非你知道键盘布局,否则它毫无用处。但幸运的是,我们可能遇到的所有键盘都同意(大多数)功能键。没有办法确定键盘布局(包括大写锁定状态等),因此我们实际上无法为可打印按键提供polyfill。我不同意根据我们目标的浏览器限制
key
支持。对于那些具有原生支持并报告字符值或更完整按键集的浏览器,我们没有从中获得任何好处。然而,当前的原生key
支持是一个混乱(并且有些损坏)的问题,因此对于损坏的浏览器明确忽略原生key
有一些道理,但我认为这不是我们真正想要玩的游戏(而且我认为没有需求来证明开发成本是合理的)。lp0sw83n4#
我们通过报告在浏览器中有原生支持且确实报告字符值或更完整一组键的 Unidentified 来获得什么好处。我不同意,我认为我们获得了预期行为的基线以及可以安全依赖的内容。目前,某人可能正在使用
key
作为可打印键,甚至不知道它仅在 Firefox 中有效。人们使用像 jQuery 和 MooTools 这样的语言库的整个原因是它们平滑了浏览器兼容性问题并提供了良好的基线功能。如果你编写了一些 jQuery 事件处理代码,你基本上可以确定它在跨浏览器中将以相同的方式工作。React 的事件系统应该做同样的事情并提供同等的跨浏览器支持。
5us2dqdw5#
如果我们无法做到这一点,至少在帮助中有一个大的警告,解释
key
是不可靠的,除了功能键之外不应该依赖它。0s0u357o6#
我用 latest 16 release 进行了测试:
key
对于 Chrome 和 Firefox 中的 keydown/keyup 事件似乎是正确的。