【问题标题】:Is it OK to ignore keydown events with keyCode = 229?可以忽略 keyCode = 229 的 keydown 事件吗?
【发布时间】:2014-07-30 18:09:26
【问题描述】:

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

...

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

...

(+onKeyUp 事件的相同更改)

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

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

感谢您的任何帮助!

【问题讨论】:

标签: javascript events dart keyboard-events dartium


【解决方案1】:

简短的回答是不。您可以忽略 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)

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 等词。当您按下死键时,字符会出现在输入字段中,但插入点不会移动。当您随后键入一个可以与其组合的字符时,浏览器可能会将初始的死键字符替换为具有自己的 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")

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多