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