【发布时间】:2011-06-21 00:58:25
【问题描述】:
快速背景:
- 当在浏览器中按下某个键时,会生成三个事件:keyDown、keyPress 和 keyUp。
- keyDown 和 keyUp 有一个 keyCode 属性,它近似于按下的物理键。
- keyPress 还具有 charCode 属性集,该属性集考虑了修饰键和键盘布局(A 和 a 具有相同的 keyCode 但不同的 charCode)。
- 所有三个事件都具有指示在这些事件期间按下了哪些修改键的属性。
我是 noVNC 的主要开发者,我有一个棘手的问题:noVNC 需要翻译后的 charCode 值而不使用 keyPress 事件,原因如下:
- noVNC 需要将 keyDown 和 keyUp 事件分别发送到 VNC 服务器(否则它不是一个功能齐全的 VNC 客户端)。
- 更重要的是,noVNC 需要在连接时阻止默认键盘操作,这意味着调用 keyDown 事件的 preventDefault() 方法。这也有防止 keyPress 事件触发的副作用。
由于键盘布局的差异(即不同的 keyCode 到 charCode 映射),我确定 noVNC 需要针对不同键盘布局的查找表。
但真正的问题是:在替代布局中,一些不同的物理键具有 SAME 键码。例如,对于 azerty(法语)键盘布局,“-”(破折号)和“_”下划线键都会生成 keyCode 189。Ack!!!
那么...如何获得正确的 keyCode 到 charCode 映射并同时防止默认浏览器操作?
顺便说一句,我怀疑此解决方案将适用于其他交互式 Web 应用程序和 HTML5 游戏,因为您通常希望能够在不触发任何其他浏览器对该按键的响应的情况下了解有关按键的完整信息。
有用的链接:
- Here 是一个有用的测试页面,它显示了三个事件和一些其他有用的属性。
- Summary Javascript 中关键事件的疯狂状态(感谢@Tim)
- 怪癖模式Detecting keystrokes
- 怪癖模式Events - key events
- noVNC issue 更多地讨论这个问题。
解决方案:见下面我的帖子。
【问题讨论】:
标签: javascript html browser cross-browser