我正在做一个简单的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);
});
3条答案
按热度按时间mspsb9vt1#
这是预期的,因为此键是一种特殊类型的修饰符:
这个名字来自机械打字机,其中dead key指的是一个键,它不会移动纸张托架,而是等待下一个键击施加其效果。
在大多数软件环境中,当你按下这个键时,它会以某种方式高亮显示,以表明它本身不是一个完整的字符。
(虽然字符^存在,但您仍然需要按第二个键,如空格来移动插入符号)
问题是:当按下这个键时浏览器应该做什么?
如果我们看一下KeyboardEvent接口,它提供了两个有用的属性来了解更多关于按键的信息,
key
和code
属性。code
属性指的是绑定到键盘布局的物理键。检测哪个物理键被按下没有问题,在我的例子中,按^返回BracketLeft
。同样,这取决于布局:例如,在AZERTY布局中,按下A给出KeyQ
代码。key
属性指的是密钥的可打印表示形式。这就是问题所在,因为死键通常不是一个完整的字符,因为系统正在等待下一次击键。所以它还没有一个可打印的表示(还没有)。正如MDN article所说:如果KeyboardEvent表示按下死键,则键值必须为“Dead”。
因此,你会观察到同样的行为与其他口音等等。它们都返回值为
Dead
的key
属性。与其他修改器(如
AltGr
或⌥ Option
)相反,当按下另一个键时,一个死键在它应该修改的键之前被按下并释放。您可以使用KeyboardEvent的altKey
和metaKey
属性来检测前一个修饰符,但您无法检测^修饰符,因为它是一个死键,而不是一个完整的字符。x8goxv8g2#
键盘事件
which
和keyCode
都已经被弃用了很多年。你应该使用key
,这是一种现代的方法,可以准确地确定在所有键盘和语言中按下的键值。从上面的链接
如果KeyboardEvent表示按下死键,则键值必须为“Dead”。
0md85ypi3#
这是罚款,例如美国或英国键盘,因为你键入{Shift}6得到^,它只是工作.
在其他语言中,您必须键入不同的内容,例如德语键盘,只需^/°(左上角的键)即可
因此,如果不使用特殊大小写(可能还要猜测用户使用的是哪种语言的键盘),解释“Dead”似乎很困难