不推荐使用KeyboardEvent.keyCode。这在实践中意味着什么?

时间:2016-02-14 17:40:50

标签: javascript key deprecated keycode

根据MDN,我们绝对应该使用.keyCode属性。它已被弃用:

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

在W3学校,这个事实被淡化了,并且只有一个附注说明.keyCode仅用于兼容性,并且最新版本的DOM事件规范建议使用.key属性代替。

问题是浏览器不支持.key,那么我们应该使用什么?有什么我想念的吗?

8 个答案:

答案 0 :(得分:20)

此外,所有keyCodewhichcharCodekeyIdentifier均已弃用:
charCodekeyIdentifier是非标准功能 自Chrome 54和Opera 41.0起,keyIdentifier被删除 keyCode在带有普通字符的按键事件上返回0。

The key property

 readonly attribute DOMString key
  

保持与按下的键对应的键属性值

截至撰写本文时,key属性受到以下所有主流浏览器的支持:Firefox 52,Chrome 55,Safari 10.1,Opera 46.除了Internet Explorer 11以外: 使用AltGraph 非标准密钥标识符和不正确的行为。 More info
                 如果这很重要和/或向后兼容性,那么您可以使用功能检测,如下面的代码所示:

请注意,key值与keyCodewhich属性的不同之处在于:它包含密钥的名称而不是其代码。如果你的程序需要字符'然后您可以使用charCodeAt()代码。 对于单个可打印字符,您可以使用charCodeAt(),如果您正在处理其值包含多个字符的键,例如 ArrowUp 机会是:您正在测试特殊键并采取相应的措施。因此,尝试实施一个密钥表'价值观及其相应的             代码charCodeArr["ArrowUp"]=38charCodeArr["Enter"]=13charCodeArr[Escape]=27等等,请查看Key Values及其corresponding codes

if(e.key!=undefined){
        var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0);
    }else{
        /* As @Leonid suggeted   */
        var characterCode = e.which || e.charCode || e.keyCode || 0;
    }
        /* ... code making use of characterCode variable  */  

您可能想要考虑向前兼容性,即在它们可用时使用旧版属性,并且只有在掉线时才切换到新属性:

if(e.which || e.charCode || e.keyCode ){
        var characterCode = e.which || e.charCode || e.keyCode;
    }else if (e.key!=undefined){
        var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0);
    }else{
        var characterCode = 0;
    }

另请参阅:KeyboardEvent.code属性docs以及此answer中的更多详细信息。

答案 1 :(得分:17)

您可以通过三种方式处理它,因为它是在您共享的链接上编写的。

if (event.key !== undefined) {

} else if (event.keyIdentifier !== undefined) {

} else if (event.keyCode !== undefined) {

}

你应该考虑它们,如果你想要跨浏览器支持,这是正确的方法。

如果你实现这样的事情可能会更容易。

var dispatchForCode = function(event, callback) {
  var code;

  if (event.key !== undefined) {
    code = event.key;
  } else if (event.keyIdentifier !== undefined) {
    code = event.keyIdentifier;
  } else if (event.keyCode !== undefined) {
    code = event.keyCode;
  }

  callback(code);
};

答案 2 :(得分:12)

TLDR:我建议您使用新的event.keyevent.code属性而不是旧版属性。 IE和Edge支持这些属性,但尚不支持新的密钥名称。对于他们来说,有一个小的polyfill,使他们输出标准的键/代码名称:

https://github.com/shvaikalesh/shim-keyboard-event-key

我来到这个问题,寻找与OP相同的MDN警告的原因。在搜索了更多内容之后,keyCode的问题变得更加清晰:

使用keyCode的问题是非英语键盘可以产生不同的输出,甚至具有不同布局的键盘也会产生不一致的结果。

的情况也是如此

如果您阅读W3C规范: https://www.w3.org/TR/uievents/#interface-keyboardevent

  

实际上,keyCode和charCode在各个平台之间不一致,甚至在不同操作系统上使用相同的实现或使用不同的本地化。

它深入描述了keyCode的错误: https://www.w3.org/TR/uievents/#legacy-key-attributes

  

这些功能从未正式指定,当前的浏览器实现方式也有很大差异。依赖于检测用户代理并相应地执行操作的大量遗留内容(包括脚本库)意味着任何将这些遗留属性和事件正式化的尝试都有可能破坏尽可能多的内容以及修复或启用的内容。此外,这些属性不适合国际使用,也不涉及可访问性问题。

因此,在确定更换旧密钥代码的原因之后,让我们看一下您今天需要做的事情:

  1. 所有现代浏览器都支持新属性(keycode)。
  2. IE和Edge支持较旧版本的规范,某些密钥的名称不同。你可以使用垫片:https://github.com/shvaikalesh/shim-keyboard-event-key(或自己滚动 - 反正它很小)
  3. Edge已在最新版本中修复此错误(可能将于2018年4月发布) - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
  4. 请参阅您可以使用的事件键列表:https://www.w3.org/TR/uievents-key/

答案 3 :(得分:10)

MDN已经提供了解决方案:

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Should do nothing if the default action has been cancelled
  }

  var handled = false;
  if (event.key !== undefined) {
    // Handle the event with KeyboardEvent.key and set handled true.
  } else if (event.keyIdentifier !== undefined) {
    // Handle the event with KeyboardEvent.keyIdentifier and set handled true.
  } else if (event.keyCode !== undefined) {
    // Handle the event with KeyboardEvent.keyCode and set handled true.
  }

  if (handled) {
    // Suppress "double action" if event handled
    event.preventDefault();
  }
}, true);

答案 4 :(得分:9)

例如,如果要检测是否单击了“ Enter”键:

代替

event.keyCode === 13

喜欢做

event.key === 'Enter'

答案 5 :(得分:0)

这里建议使用 key 值而不是 keyCode,如果失败则使用 keyCode。尽管这还不够,因为此属性中的值不兼容。事情是新的 key 包含控制键的字符串,例如:ArrowUp,但 keyCode 将只包含简单的代码

String.fromCharCode(event.keyCode)

将导致不可打印的字符。这里是可打印字符的解决方案:

element.keydown((event) => {
    var symbolPressed;
    //cross browser
    if (event.key !== undefined) {
        symbolPressed = event.key; //Here control characters represented as String like: ArrowUp
        if (symbolPressed.length > 1) return; //filter out control characters
    } else if (event.keyCode !== undefined) {
        symbolPressed = String.fromCharCode(event.keyCode); //Here control chars represented as one char string
    }
    //Update this regex if you need other characters
    if (!symbolPressed.match(/[A-z0-9\s]/)) return;
    console.log(symbolPressed);
});

如果您需要不可打印的控制字符,您必须相应地更新条件和正则表达式。

答案 6 :(得分:-1)

您可以使用

parseInt(event.key, radix: 10)

答案 7 :(得分:-3)

(e)=>{
  e.key === 'Escape';
}

相同
(e)=>{
  e.keyCode === 27;
}

最好使用第二个。