代码之家  ›  专栏  ›  技术社区  ›  Aloso

Javascript-获取任何键盘布局的键描述

  •  11
  • Aloso  · 技术社区  · 6 年前

    对于富web应用程序,我需要键盘快捷键。因为有许多不同的键盘布局,所以它们必须是可配置的。不幸的是,我无法找到将键盘事件映射到 人类可读的快捷方式名称 例如 Ctrl+Alt+Y Alt+\ .

    这个 keypress 事件是无用的,因为它不会为所有键触发。以下是的一些属性 keydown 事件:

    • charCode :仅适用于可打印字符。 已弃用 ,根据MDN
    • code :工作,但忽略键盘布局。当我按Z时,我得到 code: "KeyY" 在我的德语键盘上。
    • key :工作,但根据修改器给出不同的结果。E、 g.Shift+3收益率 key: "§" 在我的键盘上和 key: "#" 在大多数美国键盘上。
    • keyCode :该值不唯一,或^收益率 keyCode: 0 . 已弃用 ,根据MDN
    • which :就像 键代码 ,该值不是唯一的。 已弃用 ,根据MDN
    • altKey , ctrlKey , metaKey , shiftKey :用于检测修改器关键点

    我应该怎么做?甚至在不知道用户键盘布局的情况下也有可能吗?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Developer Guy Adam    6 年前

    问题是,此时此刻,你永远无法从浏览器中了解键盘布局,你只能猜测。有多种方法可以尝试某种检测,但它们总是很复杂,不是现成的解决方案。

    然而,您可以做一些事情来确定按下了什么键。

    因此,Keydown将为您提供(假设事件对象为e):

    e、 代码 :保存标识正在按下的物理键的字符串。值为 不受当前键盘布局或修改器状态的影响 ,因此特定键将 总是 返回相同的值。(来自mozilla.org)

    e、 密钥 :事件表示的键的键值。如果该值具有打印的表示形式,则该属性的值与 烧焦 属性

    e、 其中 e、 键代码 :虽然已弃用,但将为您提供键盘上键的位置代码,如果e.charCode为0,则这是位置代码(如果<256)或unicode(这意味着键盘以另一种语言切换)

    现在棘手的是 e、 密钥 实际上代表 unicode 字符,如果它是可打印的,并且不是来自美国键盘,并且不是特殊键。您可以将此字符转换为十进制数并检查值。如果是unicode字符,则其十进制值将等于which和keyCode值。如果是和普通ASCII,则其小写值将等于which和keyCode值。此外,在执行此操作(转换)之前,您可以检查e.key是一个字符串(如Control、Alt、CapsLock等)还是一个字符(如a、b、c等),因此如果它是一个字符,那么您可以转换它。

    所有这些都会让您知道按下了哪个键,以及这个键的本机可打印字符是什么。我没有德语、意大利语或其他键盘要测试,但你明白了。

    哦,如果你担心 转移 + 3. 产生“§”或“#”,您应该始终将该组合表示为Shift+3,无论它产生的字符是什么,更不用说将通过以下组合产生相同的字符 Ctrl键 + 转移 + 3. . 你只需要担心字母字符,但我相信我给了你检查的方法。

    此外,我相信您可能不需要 e、 其中 e、 键代码 ,因为 e、 密钥 应该给你一切。

        2
  •  2
  •   schlebe    6 年前

    我认为你的问题不是问题,只是对问题的错误分析,你已经有了答案!

    你说你想定义 人类可读的快捷方式 而你拒绝了 key 属性,因为当用户按Shift+3时,键值为 § 我想你正在等待键值是3。

    问题是“ 什么是人类可读的? ".

    紧迫的 § 以及获得 § 或者开发人员说当他按下 § 按下Shift+3,他获得 § 而不是Shift+3。

    但如果用户按下 § 或Shift+3(在德语键盘上),键值等于 § 当用户仅按时,您可以使用keydown事件进行拦截 3 § .

    在我的法语键盘上,我有一个键 é 和数字在同一个键上 2 . 如果我按键 é (或2)我获得“”字符。如果我按Shift+2键(或Shift+),我将获得 2. 性格

    我可以使用keydown事件来截取Ctrl+和Ctrl+2(=Ctrl+Shift+2),没有问题。

    我认为您可以使用keydown事件来拦截 § . 无法拦截Shift+3,因为Shift+3相当于 § .

    如果您的目标是独立于键盘布局截取SHIFT+数字键 ,您可以添加一些Javascript代码来为数字键创建一些异常(或过滤器)( 但只有数字键 ),我认为没有必要使用其他钥匙。

    在这种情况下,您可以考虑 keyCode 要拦截的属性 按数字键 .

    在任何情况下,都不必知道键盘的布局。

    目前,我使用法语/法语、法语/比利时、法语/瑞士和美国/美国键盘(或Tastatur),20年前,我在使用MFC编写C++ActiveControl时遇到了同样的问题。

    如果我的回答对你来说不够好,你能举一些例子,这样我就可以帮助你处理这个新的具体案例。

        3
  •  2
  •   Tarun Lalwani    6 年前

    与其重新发明轮子,我宁愿使用已经实现了这一点的跨浏览器库

    https://github.com/ccampbell/mousetrap

    我无法将完整的JavaScript粘贴到这里,以避免出现仅链接的答案,因为JS超过了允许的字符数限制。