为什么 JS 键盘代码 ^ 返回死亡?

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)

fcr*_*ier 5

这是预期的,因为这个键是一种特殊类型的修饰符:

\n

该名称源自机械打字机,其中死键是指不移动纸架而是等待下一次击键来应用其效果的键。

\n

现在在大多数软件环境中,当您按下此键时,它会以某种方式突出显示,以表明它本身不是一个完整的字符。

\n

死键突出显示

\n

(虽然字符 ^ 存在,但您仍然必须按第二个键(例如空格)来移动插入符号)

\n

问题是:按下这个键时浏览器应该做什么?

\n

如果我们看一下KeyboardEvent接口,它提供了两个有用的属性来了解有关按键的更多信息,即keycode属性。

\n

code属性是指绑定到键盘布局的物理键。检测按下哪个物理键没有问题,在我的情况下按 ^ 返回BracketLeft。同样,这取决于布局:例如,在 AZERTY 布局中按 A 会给出KeyQ代码。

\n

key属性是指密钥的可打印表示形式。这就是问题所在,因为死键通常不是完整的字符,因为系统正在等待下一次击键。所以它还没有可打印的表示。正如MDN 文章所说:

\n
\n

如果 KeyboardEvent 表示按下死键,则键值必须为“Dead”。

\n
\n

因此,您将观察到其他重音符号 \xc2\xa8 ` 等的相同行为,它们都返回值为keyvalue 的属性Dead

\n

与在按下另一个键时按住AltGr或 之类的其他修饰键相反,死键是在它应该修改的键之前按下并释放的。您可以使用 KeyboardEvent 的和属性\xe2\x8c\xa5 Option检测前一个,但您无法检测 ^ 修饰符,因为它是死键而不是完整的字符。altKeymetaKey

\n