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

Javascript-获取任何键盘布局的键描述,javascript,events,keyboard-shortcuts,keyboard-events,Javascript,Events,Keyboard Shortcuts,Keyboard Events,对于富web应用程序,我需要键盘快捷键。因为有许多不同的键盘布局,它们必须是可配置的。不幸的是,我无法找到一种方法将键盘事件映射到人类可读的快捷方式名称,如Ctrl+Alt+Y或Alt+\ keypress事件是无用的,因为它不会为所有键触发。以下是keydown事件的一些属性: charCode:仅适用于可打印字符已弃用,根据MDN code:工作,但忽略键盘布局。当我按Z键时,我的德语键盘上会出现code:“KeyY” 键:起作用,但根据修改器给出不同的结果。例如。Shift+3在我的键盘

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

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

  • charCode
    :仅适用于可打印字符已弃用,根据MDN
  • code
    :工作,但忽略键盘布局。当我按Z键时,我的德语键盘上会出现
    code:“KeyY”
  • :起作用,但根据修改器给出不同的结果。例如。Shift+3在我的键盘上产生
    键:§“
    ,在大多数美国键盘上产生
    键:“#”
  • keyCode
    :该值不是唯一的。Ä、Ö、Ü或^产生
    keyCode:0
    已弃用,根据MDN
  • which
    :与
    keyCode
    一样,该值不是唯一的已弃用,根据MDN
  • altKey
    ctrlKey
    metaKey
    shiftKey
    :用于检测修改键

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

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

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

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

e.code:保存一个字符串,用于标识正在按下的物理键。该值不受当前键盘布局或修改器状态的影响,因此特定键将始终返回相同的值。(来自mozilla.org)

e.key:事件表示的键的键值。如果该值具有打印的表示形式,则该属性的值与char属性相同

e.whiche.keyCode:虽然已弃用,但会给出键盘上键的位置代码,如果e.charCode为0,则这是位置代码(如果<256)或unicode(这意味着键盘以另一种语言切换)

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

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

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


而且,我相信你可能甚至不需要e.whiche.keyCode,因为e.key应该给你一切。

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

你说你想定义人类可读的快捷键,你拒绝了键,因为当用户按下Shift+3时,键值是,
§
,我想你在等待键值是3

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

§
并获得
§
或开发人员说当他按Shift+3中的
§
时,他获得
§
而不是Shift+3是不正常的

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

在我的法语键盘上,我有一个键
é
,它与digit
2
位于同一个键上。如果我按下键
é
(或2),我将获得“é”字符。如果我按Shift+2键(或Shift+é键),我将获得一个
2
字符

我可以使用keydown事件毫无问题地截取Ctrl+é和Ctrl+2(=Ctrl+Shift+2)

我认为您可以使用keydown事件截获
§
。拦截Shift+3是不可能的,因为Shift+3相当于
§

如果您的目标是独立于键盘布局截取SHIFT+数字键,您可以添加一些Javascript代码来为数字键(但仅为数字键)创建一些异常(或过滤器),我认为其他键不必这样做

在此情况下,可以考虑<代码>键代码< /Cord>属性拦截<强>按下数字键>/P> 在所有情况下,尝试了解键盘的布局是没有必要的

目前,我使用法语/法语、法语/比利时、法语/瑞士和美国/美国键盘(或Tastatur),我遇到了sam