10

一开始我想<input type="text">实时监控 a 的变化(例如,当用户按下一个键时)。该onChange事件不起作用,因为它仅在用户按下 Enter 或从输入元素移除焦点时触发。然后我在 StackOverflow 上看到了这个问题。我尝试了该答案中的代码,但问题是我不想收到不代表可打印字符的按键的通知,因此我必须以这种方式对其进行修改以使其验证事件中是否有可打印字符:

...

textInputElement.onKeyDown.listen((KeyboardEvent ev) {
  if (new String.fromCharCode(ev.keyCode).length > 0) {
    callAFunction();
  }
});

...

(+onKeyUp事件的相同更改)

当我在 Dartium 中对此进行测试时,我看到通过聚焦输入元素然后按任意键,keydown会触发一个事件ev.keyCode = ev.which = 229and ev.charCode = 0keydown在此事件之后,立即触发另一个事件ev.keyCode = ev.which,按下的键和正确ev.charCode = 0。我不明白这个 229 键是从哪里来的,但我看到它是一个可打印的字符,å. 我在网上搜索,发现其他人也有这个问题,有时他们正在使用其他编程语言和技术。一个相关的链接是这个,选择的修复是在这个非常小的提交中——他们选择忽略所有具有keyCode = 229解释说最近版本的 Chrome/Chromium/WebKit 开始在每个标准键盘事件之前发送这些 keydown 事件,它们的含义是用户按下了某个按钮。但输入法仍在处理,或者输入法编辑器正在处理按键输入

我的问题是,如果返回可打印字符“ ”可以忽略keydown事件吗?我想到了可能的情况,即拥有一个产生相同键码及其对应字符的真实键。keyCode = 229new String.fromCharCode(229)å

我感谢您的任何帮助!

4

1 回答 1

13

简短的回答是否定的。您可以忽略 keyCode = 229 的 keydown 事件,但前提是它们紧跟在按键事件之后。

如果您按住某些键,某些浏览器会发送重复的 keydown 事件,其 keyCode 值为 229,而其他浏览器会再次发送原始 keydown keyCode。一些浏览器发送 0 作为与按键事件关联的 keyCode,并将字符代码放在 charCode 属性中。

在所有情况下,据我的测试可以看出,事件的顺序总是可以预测的:

keydown  (event.keyCode  = key-keyCode            ex: 65 = "A")
keypress (event.keyCode  = 0 | character-keyCode  ex: 97 = "a")  - conflated model
          event.charCode =     character-keyCode                 - split model
keydown  (event.keyCode  = 229 | key-keyCode      ex: 229 | 65)  - may be repeated
keyup    (event.keyCode  = key-keyCode            ex: 65)

字母 å用于许多斯堪的纳维亚语言。以下是 Safari 6.1.5 在键盘设置为瑞典语或芬兰语并按下 å 字符(P 键左侧)时收到的事件:

EVENT    keyCode
keydown  219     ("[" key position)
keypress 229     (å)
keydown  229     (repeatedly, indicating that the Input Monitor is busy)
keyup    219

请注意,初始 keydown keyCode 是 219,而不是 229。

要在初始 keydown 事件上生成 229 keyCode,您可以按任何“死键”。例如,在 Mac 上的瑞典语键盘上,紧靠 BACKSPACE 键左侧的键是 ´(重音),如 déjà-vu 之类的词中所用。当您按下死键时,字符会出现在输入字段中,但插入点不会移动。当您随后键入一个可以与其组合的字符时,浏览器可能会用具有自己的 Unicode 值的组合字符 (´ + e = é) 替换初始死键字符。

以下是您在 Safari 6.1.5 中看到的事件,当用户在瑞典语键盘上按下并释放 ´ 后跟 e 时:

EVENT    keyCode
keydown  229 (dead key)
keyup    187 (acute accent)
keydown  229 (second key is being treated)
keyup     69 ("E")

请注意,根本没有发送按键事件,因为没有“é”键被按下。如果您想确定用户输入了哪个字符,您可以等到第二次按键之后,然后从输入字段中读取该字符。

换句话说,您可以在按键事件之后忽略任何带有 229 keyCode 的 keydown 事件,但是如果您忽略所有 229 keyCode,您可能会阻止用户添加各种变音字符。

有关 keyCode 229 的更多信息,来自 w3.org 站点:keyCode 关键事件的属性

于 2014-08-26T15:12:32.177 回答