检测按键按下时的Alt Gr(Alt Graph)修饰符

19
在JavaScript的Event对象中,有几个布尔值来检查是否按下了修改键:
- `ctrlKey`:CTRL键。 - `altKey`:ALT键。 - `altLeft`:ALT左键。仅适用于IE。 - `altGraphKey`:ALTGR键。仅适用于Chrome / Safari。
然而,存在一些问题:
- 当您按下ALTGR修改键时,IE和Chrome将`ctrlKey`设置为`true`,并将`altKey`设置为`true`。 - Firefox在按下ALTGR修改键时将`ctrlKey`设置为`false`,将`altKey`设置为`true`,因为只按下了ALT键。 - Chrome具有`altGraphKey`属性,但它始终是`undefined`。
问题:如何区分ALT+CTRLALTGR键按下?特别是在Chrome中。

1
当前浏览器的行为(截至2013年9月)已经改变。请参见下面的答案。 - Jason
4个回答

12

在 Webkit 浏览器中,altGraphKey(截至2013年9月)似乎已经不存在了,而 Firefox 的行为也发生了变化。目前,AltGr 键的浏览器行为似乎如下:

  • Webkit(Chrome)- ctrlKey: true,altKey: true
  • IE 8 - ctrlKey: false,altKey: true
  • IE 10 - ctrlKey: true,altKey: true
  • Mozilla(Firefox)- ctrlKey: true,altKey: true

也就是说,它们目前都保持一致(除了 IE8,它始终不一致)。

以下代码段应该可以在现代浏览器中捕获 Alt Gr - 但不是 AltCtrl,但是您需要一个特殊情况来处理 IE8:

if (event.ctrlKey && event.altKey) {
    // Appears to be Alt Gr
}

3
按下CTRL+ALT+S并不等同于按下ALTGR+S。我正在使用美式国际键盘布局,最近在Visual Studio Code(基于Electron)中输入德文ß字符时遇到了问题。结果并没有出现ß字符,却弹出了“运行任务”菜单(快捷键为CTRL+ALT+S)。我认为这是一个Bug。 - user643011
1
当您在德语键盘上按下AltGr+Q时,会发生完全相同的事情。它应该发出@字符,但实际上会通知CTRL+ALT+Q JavaScript键盘快捷方式处理程序。有趣的是,我只能在Windows上重现这个问题 - 在Linux上,@字符会正确地发出。我认为这是一个错误,但在Windows上,Edge、Firefox和Chrome的行为是一致的?我感到非常困惑... - Martin Vysny
在Android上的噩梦,同样的问题现在使得通过Web浏览器使用VSCode对于国际用户来说几乎无法使用。当检查按下AltGr和8时发送的信息时,意思是[,然后ctrlKey和altKey bools变为true,但实际上键(代码?)是[而不是8。这仍然会在Electron / VSCode中造成混乱,因为由于设置了Ctrl和Alt键,它不被视为普通的[。 - TheDiveO

5

声明:我没有这个键的键盘,所以无法进行测试,但规范说明可以使用key属性。如果您只需要支持实现它的浏览器(目前只有Safari不支持),这可能是一个好的解决方案。您可以检查值是否为"AltGraph"

window.onkeydown = function (e) {
  if (e.key === 'AltGraph') {
    console.log(e.key);
  }
};


@zuluk 感谢您的通知。您能否确认它在其他浏览器中是否有效? - Frank Tan
@zuluk 这很有趣。我想知道其他值是否对您有效? - Frank Tan
这个答案在 Windows 10 下的 Chrome 67 版本中,无论是物理键盘还是屏幕键盘都能完美运行。它还可以区分 AltGr 和 Ctrl+Alt,因此这是我在 Chrome 中首选的解决方案。参见:https://github.com/Microsoft/vscode/issues/50341#issuecomment-399053187 但 Firefox 和 Edge 仍然不支持。 - user643011

1

1
我猜ALTGR键和CTRL+ALT键组合是一样的,在Javascript中没有办法区分它们。 在我的键盘/语言设置中,按下ALTGR+eCTRL+ALT+e都会产生€(欧元)符号。 有在线页面可以检查按键代码。希望这能帮到你。

是的,这是一个Google Chrome的bug,在Canary版本中可以正常工作,在Opera和Firefox中也可以正常工作。请查看:http://jsfiddle.net/iegik/PpH76/ - iegik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接