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

sil*_*gan 9 javascript events keyboard-events dart dartium

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

...

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

...
Run Code Online (Sandbox Code Playgroud)

(+ onKeyUp事件的相同变化)

当我在Dartium中测试时,我看到通过聚焦输入元素然后按任意键,keydownev.keyCode = ev.which = 229和触发事件ev.charCode = 0.在此事件发生后,立即keydown触发另一个事件ev.keyCode = ev.which,并按下正确的键ev.charCode = 0.我不明白这把229钥匙来自哪里,但我看到它是一个可打印的角色,å.我搜索了互联网,我发现其他人有这个问题,有时他们正在使用其他编程语言和技术.一个相关的链接是这个,选择的修复是在这个非常小的提交 - 他们选择忽略所有事件,并keyCode = 229解释最近版本的Chrome/Chromium/WebKit开始在每个标准键盘事件之前发送这些keydown事件,并且他们的意思是用户按下了一些按钮.但输入法仍在处理输入法编辑器处理键输入.

我的问题是,keydownkeyCode = 229if new String.fromCharCode(229)返回可打印字符" å" 可以忽略事件吗?我想到了一个产生相同密钥代码及其相应字符的真实密钥的可能情况.

我感谢你提供任何帮助!

Jam*_*ton 13

简短的回答是否.您可以使用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)
Run Code Online (Sandbox Code Playgroud)

封信用于许多斯堪的纳维亚语言.以下是当键盘设置为瑞典语或芬兰语时按下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
Run Code Online (Sandbox Code Playgroud)

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

要在初始keydown事件上生成229 keyCode,您可以按任何"死键".例如,在Mac上的瑞典语键盘上,BACKSPACE键左侧的键是'(急性重音符号),用于像déjà-vu这样的单词.按下死键时,字符将出现在输入字段中,但插入点不会移动.当您随后键入可与其组合的字符时,浏览器可以使用具有其自己的Unicode值的复合字符('+ e =é)替换初始死键字符.

以下是用户在瑞典语键盘上按下并释放'后跟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")
Run Code Online (Sandbox Code Playgroud)

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

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

有关keyCode 229的更多信息,请访问w3.org站点:key事件的keyCode属性