【发布时间】:2015-03-07 19:22:10
【问题描述】:
我已经写了a text editor in JavaScript that draws directly to a Canvas element(出于各种原因,但我的主要原因是我可以将该画布作为纹理贴到 WebGL 网格上)。令人惊喜的是,与我发现的任何可编辑内容的解决方案相比,它更容易实施。
我早期注意到的一件事是,使用非 en-US QWERTY 键盘布局的人抱怨某些键显示的字母不正确。在对 Windows 的语言设置和屏幕键盘进行了一些摆弄之后,我创建了一个基于代码页的解决方案,该解决方案将 keyCodes 直接映射到不同语言环境的字符串,而不是仅仅假设“没有修饰键的 keyCode 51 是数字 3 ”。因为它不是,所以在某些键盘上它是双引号。
但还是有一些奇怪的地方。几个例子(请注意,所有这些例子都是基于使用 Windows 屏幕键盘,所以我只是假设这与现实相关):
- 法语 AZERTY 键盘会在输入字母 U 时发送 keyDown 和 keyPressed 事件,但不会发送 keyUp。我假设 U 必须需要与另一个键组合,但不知道正确的行为应该是什么阻止了我编写正确的代码。 编辑:我还没有完全弄清楚这意味着什么,other than--perhaps--that key is only used in one word the entire French language?
-
德语 QWERTZ 键盘有一个 ^(它不是插入符号,它看起来更大)键,`(反引号)键在美式键盘上,还有一个反引号键, = ( equals) 键将在美式键盘上。在这两种情况下,它们都会发送 keyDown 和 keyUp 事件,但在我使用的任何文本编辑器中似乎都没有打印任何内容,直到它们被第二次点击,然后打印了两个字符。这与组合标记有关吗?我找不到任何关于它的信息。编辑:These are called dead keys,他们会创建重音字母。许多键盘布局都有它们。我将为此创建一个按键序列系统,这也将有助于为更复杂的 Emacs 风格的键盘快捷键(如果选择的话)提供支持。 -
UK QWERTY 键盘有一个反斜杠,需要使用 ALT-GRAPH 键(美国键盘上的 Right-Alt 键)。有一个 location property of KeyboardEvent 可用于确定按下了哪个 ALT 键,但它显然在 Safari 中不可用。这是相当低的优先级,因为 Safari 通常只占我流量的 1% 或更少。但是,是否有一个适用于 Safari 的属性可以用作后备?编辑:我将处理这个问题,因为我的代码页系统的其余部分适用于下层和上层之间的差异-case 键。这只是新修饰键的不同代码页。我将不得不更改检测修饰键的方式,但这是一个很小的更改,实际上很容易适应键盘快捷键系统。 - 最后,从Windows的语言设置来看,世界上有很多不同的键盘布局。是否有任何键码和行为列表?我宁愿不必为了为它们生成新的代码页而手动测试每个键盘。
前两个问题是最大的。如果我只知道行为应该是什么,我就可以找出解决方案。第三个问题将适合我的代码页系统,但我将不得不改变我阅读修饰键的方式。最后一期,我可能会花钱请人来报道。
我很高兴不能 100% 地为所有浏览器中的所有用户解决这个问题。但是我遇到的大部分信息基本上都是“不要打扰”,听起来更像是“我不知道”。
编辑:选择布局不是问题。如果事情对他们不起作用,我将它作为一个选项提供给用户。我认为这是在这种情况下可以做的最好的事情,但显然如果可以的话,我会自动检测。鉴于已经选择了正确的布局,我真的只关心获得正确的行为。
我想避免任何涉及 keyPress 事件的事情,因为它并不完全可靠。如果我有可靠的键盘布局数据来源,那将不是问题。
【问题讨论】:
标签: javascript internationalization keyboard keyboard-events