may*_*hem 4 javascript dom-events
我正在编写一个简单的 JS 脚本,它获取所有键盘事件并将它们显示在屏幕上。每次我尝试键盘上的符号^(Alt Gr+ ^)时,JS都会返回死代码。
为什么会发生这种情况?我该如何解决?
editor.addEventListener('keydown', function (e) {
var keyNum = event.which || event.keyCode;
switch(keyNum) {
case 9:
buffer += "\t";
break;
case 13:
buffer += "\n";
break;
default:
if (window.event) { // IE
key = e.key;
} else if (e.which){ // Netscape/Firefox/Opera
key = e.which;
}
buffer += key;
break;
}
renderText(buffer);
});
Run Code Online (Sandbox Code Playgroud)
这是预期的,因为这个键是一种特殊类型的修饰符:
\n该名称源自机械打字机,其中死键是指不移动纸架而是等待下一次击键来应用其效果的键。
\n现在在大多数软件环境中,当您按下此键时,它会以某种方式突出显示,以表明它本身不是一个完整的字符。
\n\n(虽然字符 ^ 存在,但您仍然必须按第二个键(例如空格)来移动插入符号)
\n问题是:按下这个键时浏览器应该做什么?
\n如果我们看一下KeyboardEvent接口,它提供了两个有用的属性来了解有关按键的更多信息,即key和code属性。
该code属性是指绑定到键盘布局的物理键。检测按下哪个物理键没有问题,在我的情况下按 ^ 返回BracketLeft。同样,这取决于布局:例如,在 AZERTY 布局中按 A 会给出KeyQ代码。
该key属性是指密钥的可打印表示形式。这就是问题所在,因为死键通常不是完整的字符,因为系统正在等待下一次击键。所以它还没有可打印的表示。正如MDN 文章所说:
\n\n如果 KeyboardEvent 表示按下死键,则键值必须为“Dead”。
\n
因此,您将观察到其他重音符号 \xc2\xa8 ` 等的相同行为,它们都返回值为keyvalue 的属性Dead。
与在按下另一个键时按住AltGr或 之类的其他修饰键相反,死键是在它应该修改的键之前按下并释放的。您可以使用 KeyboardEvent 的和属性\xe2\x8c\xa5 Option检测前一个,但您无法检测 ^ 修饰符,因为它是死键而不是完整的字符。altKeymetaKey
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |