国际键盘如何处理JavaScript键盘事件?

国际键盘如何处理JavaScript键盘事件?,javascript,internationalization,keyboard,keyboard-events,Javascript,Internationalization,Keyboard,Keyboard Events,我写过(出于各种原因,但我的主要原因是,我可以将画布作为纹理拍打到WebGL网格上)。令人高兴的是,我发现的任何内容可编辑解决方案都更容易实现 我早期注意到的一件事是,除了en-US QWERTY之外,其他键盘布局的人抱怨说,一些按键显示的字母不正确。在对Windows的语言设置和屏幕键盘进行了一些修改之后,我创建了一个基于代码页的解决方案,该解决方案将键码直接映射到不同地区的字符串,而不是仅仅假设“没有修改键的键码51是数字3”。因为它不是,在一些键盘上它是双qoute 但仍有一些奇怪之处。几

我写过(出于各种原因,但我的主要原因是,我可以将画布作为纹理拍打到WebGL网格上)。令人高兴的是,我发现的任何内容可编辑解决方案都更容易实现

我早期注意到的一件事是,除了en-US QWERTY之外,其他键盘布局的人抱怨说,一些按键显示的字母不正确。在对Windows的语言设置和屏幕键盘进行了一些修改之后,我创建了一个基于代码页的解决方案,该解决方案将键码直接映射到不同地区的字符串,而不是仅仅假设“没有修改键的键码51是数字3”。因为它不是,在一些键盘上它是双qoute

但仍有一些奇怪之处。几个示例(请注意,所有这些示例都基于使用Windows屏幕键盘,因此我仅假设这与实际情况相关):

  • 当键入字母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);