国际键盘如何处理JavaScript键盘事件?
我写过(出于各种原因,但我的主要原因是,我可以将画布作为纹理拍打到WebGL网格上)。令人高兴的是,我发现的任何内容可编辑解决方案都更容易实现 我早期注意到的一件事是,除了en-US QWERTY之外,其他键盘布局的人抱怨说,一些按键显示的字母不正确。在对Windows的语言设置和屏幕键盘进行了一些修改之后,我创建了一个基于代码页的解决方案,该解决方案将键码直接映射到不同地区的字符串,而不是仅仅假设“没有修改键的键码51是数字3”。因为它不是,在一些键盘上它是双qoute 但仍有一些奇怪之处。几个示例(请注意,所有这些示例都基于使用Windows屏幕键盘,因此我仅假设这与实际情况相关):国际键盘如何处理JavaScript键盘事件?,javascript,internationalization,keyboard,keyboard-events,Javascript,Internationalization,Keyboard,Keyboard Events,我写过(出于各种原因,但我的主要原因是,我可以将画布作为纹理拍打到WebGL网格上)。令人高兴的是,我发现的任何内容可编辑解决方案都更容易实现 我早期注意到的一件事是,除了en-US QWERTY之外,其他键盘布局的人抱怨说,一些按键显示的字母不正确。在对Windows的语言设置和屏幕键盘进行了一些修改之后,我创建了一个基于代码页的解决方案,该解决方案将键码直接映射到不同地区的字符串,而不是仅仅假设“没有修改键的键码51是数字3”。因为它不是,在一些键盘上它是双qoute 但仍有一些奇怪之处。几
- 当键入字母U时,法语AZERTY键盘会发送一个keyDown和keyPressed事件,但不会发送keydup。我假设U必须与另一个键组合,但不知道正确的行为应该是什么会阻止我编写正确的代码。编辑:我还没有完全弄明白这意味着什么
- 德语QWERTZ键盘有一个^(它不是插入符号,看起来更大)键,其中`(backtick)键位于美国键盘上,一个backtick键位于美国键盘上=(equals)键处。在这两种情况下,它们都会发送keyDown和keydup事件,但在我使用的任何文本编辑器中似乎都不会打印任何内容,直到第二次点击它们,然后打印两个字符。这和组合标记有关吗?我找不到关于它的任何东西。编辑:,它们会创建重音字母。很多键盘布局都有它们。我将为此创建一个键排序系统,它还将帮助支持更复杂的Emacs风格的键盘快捷键(如果选择了)
- 英国QWERTY键盘有一个反斜杠,需要使用ALT-GRAPH键(在美国键盘上为右ALT键)。有一个可以用来确定按下了哪些ALT键,但它显然在Safari中不可用。这是相当低的优先级,因为Safari通常只占我流量的1%或更少。但是,是否有一个适用于Safari的属性可以用作备用?编辑:我将处理这个问题,因为我的代码页系统的其余部分处理大小写键之间的差异。这只是一个新修改键的不同代码页。我必须改变检测修改键的方式,但这只是一个小小的改变,实际上可以很容易地适应键盘快捷键系统
- 最后,从Windows的语言设置来看,世界上有很多不同的键盘布局。是否有任何关键代码和行为的列表?我不想为了生成新的代码页而手动测试每个键盘
我想避免任何涉及按键事件的事情,因为它并不完全可靠。如果我有一个关于键盘布局的可靠数据源,这就不会是一个问题。你无法获得键盘布局… 没有办法(使用纯JS解决方案)检测用户的键盘布局 请注意,“en-US”或“en-GB”不会映射到这些语言的任何特定/约定的键盘布局。用户的语言独立于其键映射到角色的方式 你可以根据他们的想法做出假设,但这并不能提供任何保证——它只是增加了你迎合适当布局的可能性 另请参见以下问题: …但您可以使用它输入字符: 但是,根据您所需的浏览器支持(使用canvas应该很好),您可以尝试使用
charCode
属性:
请注意,这不会返回实际字符-您将获得表示该字符的数字(而不是键):
Unicode字符代码是字符的编号(例如
数字“97”代表字母“a”)
您可以根据需要轻松地将这些代码映射到字符,或仅使用内置功能:
var userInput = String.fromCharCode(unicodeCharCode);
- 为了让自己变得聪明,你还可以(相当简单地)编写一个库,根据返回的特定键码的字符码猜测键盘布局。但不要这样:)
替代方法: 建议使用一个隐藏的(或至少是离散的)文本输入/文本框作为解决方案,这是你的应用程序关注的焦点 当你的应用程序检测到按键/按键按下等时,你可以抓取用户输入的值并将其呈现在画布上 由于您已经捕获了键盘事件,因此处理组合应该很容易(如果需要)。在某些方面,甚至不需要这样做,因为您只需监视
var userInput = String.fromCharCode(unicodeCharCode);