Javascript 事件的备选方案';s不推荐使用的KeyboardEvent.What属性
MDN声明已弃用。如何将其替换为未弃用的版本 例如,我有以下几点: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并检查各种修改键。如果需要检测和弦,可能需要构建一个状态机 背景 键盘输入分为两个阶段-向下键/向上键对(跟踪被按下的物理键)和组合字符(组合多个键序列以计算
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
{}
打破
“身份不明”案件:
警报(“如果您愿意,请处理‘未识别的’!);
}
/***还有很多其他的