javascript 为什么^的JS键盘代码返回dead?

3lxsmp7m  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(93)

我正在做一个简单的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);
});
mspsb9vt

mspsb9vt1#

这是预期的,因为此键是一种特殊类型的修饰符:
这个名字来自机械打字机,其中dead key指的是一个键,它不会移动纸张托架,而是等待下一个键击施加其效果。
在大多数软件环境中,当你按下这个键时,它会以某种方式高亮显示,以表明它本身不是一个完整的字符。

(虽然字符^存在,但您仍然需要按第二个键,如空格来移动插入符号)
问题是:当按下这个键时浏览器应该做什么?
如果我们看一下KeyboardEvent接口,它提供了两个有用的属性来了解更多关于按键的信息,keycode属性。
code属性指的是绑定到键盘布局的物理键。检测哪个物理键被按下没有问题,在我的例子中,按^返回BracketLeft。同样,这取决于布局:例如,在AZERTY布局中,按下A给出KeyQ代码。
key属性指的是密钥的可打印表示形式。这就是问题所在,因为死键通常不是一个完整的字符,因为系统正在等待下一次击键。所以它还没有一个可打印的表示(还没有)。正如MDN article所说:
如果KeyboardEvent表示按下死键,则键值必须为“Dead”。
因此,你会观察到同样的行为与其他口音等等。它们都返回值为Deadkey属性。
与其他修改器(如AltGr⌥ Option)相反,当按下另一个键时,一个死键在它应该修改的键之前被按下并释放。您可以使用KeyboardEvent的altKeymetaKey属性来检测前一个修饰符,但您无法检测^修饰符,因为它是一个死键,而不是一个完整的字符。

x8goxv8g

x8goxv8g2#

键盘事件whichkeyCode都已经被弃用了很多年。你应该使用key,这是一种现代的方法,可以准确地确定在所有键盘和语言中按下的键值。

addEventListener('keydown', function (event) {
  console.log(event.key);
});

从上面的链接
如果KeyboardEvent表示按下死键,则键值必须为“Dead”。

0md85ypi

0md85ypi3#

这是罚款,例如美国或英国键盘,因为你键入{Shift}6得到^,它只是工作.
在其他语言中,您必须键入不同的内容,例如德语键盘,只需^/°(左上角的键)即可

e.key = "Dead"
e.code = "Backquote"
e.keyCode = 220

因此,如果不使用特殊大小写(可能还要猜测用户使用的是哪种语言的键盘),解释“Dead”似乎很困难

相关问题