Javascript 事件的备选方案';s不推荐使用的KeyboardEvent.What属性

Javascript 事件的备选方案';s不推荐使用的KeyboardEvent.What属性,javascript,events,keyboard-events,Javascript,Events,Keyboard Events,MDN声明已弃用。如何将其替换为未弃用的版本 例如,我有以下几点: window.onkeydown=(event)=>{console.log(event.which);}TL;DR:以下是您应该遵守的规则: 从用户获取文本输入时,使用keypress事件和e.key 对于快捷键和其他组合,内置方式是使用keydown/keydup并检查各种修改键。如果需要检测和弦,可能需要构建一个状态机 背景 键盘输入分为两个阶段-向下键/向上键对(跟踪被按下的物理键)和组合字符(组合多个键序列以计算

MDN声明已弃用。如何将其替换为未弃用的版本

例如,我有以下几点:


window.onkeydown=(event)=>{console.log(event.which);}
TL;DR:以下是您应该遵守的规则:

  • 从用户获取文本输入时,使用
    keypress
    事件和
    e.key
  • 对于快捷键和其他组合,内置方式是使用
    keydown
    /
    keydup
    并检查各种修改键。如果需要检测和弦,可能需要构建一个状态机
背景 键盘输入分为两个阶段-向下键/向上键对(跟踪被按下的物理键)和组合字符(组合多个键序列以计算字符)

获取“文本” 如果您想知道操作系统认为合成序列是什么,应该使用

示例代码:

document.getElementById('a').addEventListener('keypress',e=>console.log(e.key))

规范中的

其中类型为无符号长,只读

它包含一个系统和实现相关的数字代码,表示与按下的键关联的未修改标识符。在大多数情况下,该值与keyCode相同

keyCode类型为无符号长,只读

keyCode包含一个系统和实现相关的数字代码,表示与按下的键关联的未修改标识符。与KeyboardEvent.key属性不同,本规范中未对可能的值集进行规范性定义。通常,键码的这些值应表示ASCII[RFC20][US-ASCII]或Windows 1252[WIN1252]中的十进制码点,但可以从不同的适当字符集提取。无法识别密钥的实现使用密钥值“0”

有关如何确定keyCode值的更多详细信息,请参见旧密钥模型

(我省略了链接)

因此,创建与规范兼容的版本非常容易。最简单的版本只是为每个键返回
0

一个稍微复杂一点的版本接受
event.key
并获取它的ASCII码。您可以对控制键执行相同的操作(
altKey
ctrlKey
shiftKey

简而言之,
的行为在系统和浏览器之间是不同的。使用未弃用的事件信息,您可以创建一个更健壮的版本,该版本可以消除这些差异,并且更加经得起未来的考验


您可以通过在主要浏览器中实现
来检查版本的行为。如果您不使用任何边缘案例,您的版本将既简单又兼容。

正如其他答案所指出的,
事件。它有一个主要问题:对于不同的浏览器或计算机,它不会返回相同的数字(可能这就是它被弃用的原因)。因此,它没有完美的替代品,因为它将为不同的用户输出不同的数字

因此,试图为其创建一个替代项(我们将其命名为:
函数whichSubstitute(event)
)的主要问题是,例如,Meta键和Shift键没有一个唯一的数字,按下其中一个键时,whichSubstitute
应该获得该数字

考虑到这一点,有两种方法可以获取用户输入的unicode代码点

  • 获取用户输入的字符的unicode值(例如,
    ü
    ,即
    “ü”。codePointAt(0)
  • 获取与键盘中按下的物理键对应的字符的数值,该数值可能与输入到文本字段的数值不同。正如AnilRedShift提到的,键盘布局可能会改变键盘中该键的“自然”输出,从而使键s可能输出
    o
    。在本例中,我们将获得
    's'.codepoint(0)
    ,而不是获得
    'o'
    (即实际输出的内容)的值,就像我们使用第一种方法得到的一样: 例如,返回的代码是“
    KeyQ
    ”,用于QWERTY布局键盘上的“
    q
    ”键,但相同的代码值还表示Dvorak键盘上的“
    ”键和AZERTY键盘上的“
    a
    ”键。这使得如果用户没有使用预期的键盘布局,就无法使用代码值来确定键的名称

    简言之:方法1获取
    U
    的unicode码点,而方法2获取SHIFT、6和U的码点(因为SHIFT+6+U=
    U

    在这个答案中,我们将使用
    String.prototype.codePointAt()
    而不是
    String.prototype.charCodeAt()
    。原因是我们可以使用
    .codePointAt(0)
    获得整个unicode数字,而
    .charCodeAt(0)
    将缺少
    .codePointAt(1)
    来完成UTF-16编码码点

    对于方法1,我们可以使用以下代码:

    替换的函数(事件){
    const theKey=event.key;
    if(theKey.length==1){
    在(0)处返回key.codepoint;
    }
    开关(钥匙){
    案例“Backspace”:
    返回8;
    案例“选项卡”:
    返回9;
    案例“输入”:
    返回13;
    案例“Alt”:
    返回18;
    “逃逸”案:
    返回27;
    案例“删除”:
    返回127;
    case“Dead”://截至2018年7月,Firefox不支持“Dead”键https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
    {}
    打破
    “身份不明”案件:
    警报(“如果您愿意,请处理‘未识别的’!);
    }
    /***还有很多其他的