国际键盘如何与JavaScript键盘事件配合使用?

时间:2015-01-09 12:58:33

标签: javascript internationalization keyboard keyboard-events

我写过a text editor in JavaScript that draws directly to a Canvas element(出于各种原因,但我的主要原因是我可以将画布作为纹理拍到WebGL网格上)。令人高兴的是,我发现任何可以编辑内容的解决方案都比较容易实现。

我早期注意到的一件事是来自键盘布局的人的投诉,而不是美国QWERTY,有些键显示不正确的字母。经过一番摆弄Windows'在语言设置和屏幕键盘上,我创建了一个基于代码页的解决方案,可以直接将keyCodes映射到不同语言环境的字符串,而不仅仅是假设没有修饰键的keyCode 51是数字3和#34;。因为它不是,在某些键盘上它是双重的。

但仍有一些奇怪之处。一些例子(请注意,所有这些示例都基于使用Windows屏幕键盘,所以我只假设这与现实相关):

  • 法语AZERTY 键盘在键入字母U但不输入keyUp时发送keyDown和keyPressed事件。我假设U必须与另一个密钥组合,但不知道正确的行为应该是什么阻止我编写正确的代码。 编辑:我仍然没有弄明白这意味着什么,other than--perhaps--that key is only used in one word the entire French language?
  • 德语QWERTZ 键盘有一个^(它不是插入符号,它看起来更大)键,其中`(反引号)键位于美国键盘上,并且一个反引号键,其中=(等于)键位于美国键盘上。在这两种情况下,它们都会发送keyDown和keyUp事件,但似乎不会在我使用的任何文本编辑器中打印任何内容,直到它们再次被击中,然后打印出两个字符。这与组合标记有关吗?我找不到任何相关内容。 编辑:These are called dead keys,他们创建带重音的字母。很多键盘布局都有它们。我将为此创建一个密钥排序系统,它还有助于为更复杂的Emacs风格的键盘快捷键提供支持(如果有的话)。
  • UK QWERTY 键盘有一个反斜杠,需要使用ALT-GRAPH键(美国键盘上的右键 - Alt键)。有一个 location property of KeyboardEvent 可用于确定按下了哪个ALT键,但在Safari中显然无法使用。这是非常低优先级,因为Safari通常只占我流量的1%或更少。但是,是否有适用于Safari的属性我可以用作后备? 编辑:我将处理此问题,因为我的代码页系统的其余部分适用于较低的差异和大写键。它只是新修饰键的不同代码页。我必须更改修改键的检测方式,但这只是一个小小的改动,实际上很容易适应键盘快捷键系统。
  • 最后,从Windows'判断语言设置,世界上有很多不同的键盘布局。是否有任何键码和行为列表?我不必手动测试每个键盘只是为了为它们生成一个新的代码页。

前两个问题是最大的问题。如果我只知道应该是什么行为,我可以找出解决方案。第三个问题将适合我的代码页系统,但我必须改变我读取修饰键的方式。最后一个问题,我可能会付钱给别人。

我很好,无法在所有浏览器中100%的时间内为所有用户解决问题。但我所遇到的大部分信息基本上都是“不要打扰”,这听起来更像是&#34;我不知道&#34;。< / p>

编辑:选择布局不是问题。如果事情不适合用户,我会将其作为选项提供给用户。我认为这是关于在这种情况下可以做的最好的事情,但显然我会自动检测我是否可以。鉴于已经选择了正确的布局,我真的只关心获得正确的行为。

我想避免涉及keyPress事件的任何事情,因为它不是完全可靠的。如果我在键盘布局上有可靠的数据来源,那就不是问题了。

1 个答案:

答案 0 :(得分:8)

您无法获得键盘布局......

没有办法(使用纯JS解决方案)来检测用户的键盘布局。

注意&#34; en-US&#34;或&#34; en-GB&#34;没有映射到这些语言的任何特定/约定的键盘布局。用户的语言与其键映射到角色的方式无关。

您可以根据locale / language code进行假设,但这并不能提供任何保证 - 只会增加您为适当布局提供服务的可能性。

另见这些问题:

Translate Javascript keyCode into charCode for non-U.S. keyboard layout (i.e. azerty)

Detect keyboard layout with javascript

...但您可以使用它输入字符:

但是,根据您所需的浏览器支持(使用画布,应该相当不错),您可以尝试使用charCode属性:

http://www.w3schools.com/jsref/event_key_charcode.asp

var unicodeCharCode = e.charCode;

请注意,这不会返回实际字符​​ - 您将获得代表它的数字(不是键):

  

Unicode字符代码是字符的编号(例如   数字&#34; 97&#34;代表字母&#34; a&#34;)。

您可以根据需要轻松地将这些代码映射到字符,或者只使用内置函数:

var userInput = String.fromCharCode(unicodeCharCode);
  • 聪明/为自己工作,你也可以(相当简单地)编写一个库来猜测某些keyCode返回的charCode的键盘布局。不过:)

替代方法:

用作解决方法的一个建议是使用隐藏(或至少离散)的文本输入/文本框,您的应用设置重点关注。

当您的应用检测到按键/按键等时,您可以获取用户输入的值并在画布上进行渲染。

当您已经捕获键盘事件时,处理组合应该很容易(如果需要)。在某些方面甚至不需要,因为您只需要监控用户输入的输入长度(如果用户需要三键组合输入字符,您的应用程序不必关心,你抓住结果吧。