使用keyCode = 229忽略keydown事件是否可以?

时间:2014-07-30 18:09:27

标签: javascript events dart keyboard-events dartium

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

...

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

...

(+ onKeyUp事件的相同更改)

当我在Dartium中测试时,我看到通过聚焦输入元素然后按任意键,keydownev.keyCode = ev.which = 229会触发ev.charCode = 0事件。在此事件发生后,使用正确的keydown按下的键和ev.keyCode = ev.which触发另一个ev.charCode = 0事件。我不明白这个229键的来源,但我看到它是一个可打印的字符,å。我搜索了互联网,我发现其他人有这个问题,有时他们正在使用其他编程语言和技术。一个相关链接是this,所选的修补程序位于this very small commit - 他们选择忽略所有keyCode = 229的事件,并说明最近版本的Chrome / Chromium / WebKit开始发送这些每个标准键盘事件之前的keydown事件,其含义是用户按下某个按钮。但输入法仍在处理输入法编辑器处理键输入

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

我感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:12)

简短回答是否。您可以使用keyCode = 229忽略keydown事件,但前提是它们在按键事件后立即执行。

如果按住某些键,某些浏览器会发送一个keyCode值为229的重复keydown事件,而其他浏览器会再次发送原始的keydown keyCode。有些浏览器发送0作为与keypress事件关联的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)

letter å用于许多斯堪的纳维亚语言。以下是当键盘设置为瑞典语或芬兰语时,在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这样的单词。按下死键时,字符将出现在输入字段中,但插入点不会移动。当您随后键入可与其组合的字符时,浏览器可以用复合字符('+ e =é)替换初始死键字符,该复合字符具有自己的Unicode值。

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

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

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

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

有关keyCode 229的更多信息,请访问w3.org网站:keyCode property of key events