javascript - Firefox 可以检测 MetaKey 吗?

标签 javascript firefox firefox-addon

我正在开发一个 Firefox 扩展并与元键(我键盘上的 Windows 键)作斗争。 KeyboardEvent.metaKey应该检测到它,但总是返回 false。 (您可以尝试 on MDN 或更简单的 in the jQuery API docs 。)

我可以使用 KDE 16.08/Gentoo 上的 Firefox 48.0 和 Windows 10 上的 Firefox 47.0.1 重现此问题。我还尝试了 Ctrl、Shift 和 Alt 的所有组合,但没有注册为元。

顺便说一句,Chrome 53.0 没有这个问题。

最佳答案

不,是:
是的,Firefox 可以检测 Windows 键,但不能检测为“元”键。两个keyupkeydown为该键触发事件,但不是 keypress事件。 Chrome 也类似地触发事件(没有 keypress )。 keyCode在 Chrome 和 Firefox 上是相同的,但他们认为两者之间的关键是不同的。 Chrome 将 key 视为“Meta” key ,而 Firefox 将其视为“OS” key 。因此,Firefox 没有设置 metaKey属性(property)给 true ,因为从 Firefox 的 Angular 来看,“Meta”键没有被按下。

Firefox 当前对 Windows 键的解释(可能还有 Mac 命令,但我没有测试过)与 KeyboardEvent.metaKey 上的文档相反。 . Firefox 代码或文档需要更改。文件至少应说明当前情况。如果不解释为什么这种行为目前是这种方式,我会认为它是 Firefox 中的一个错误。同时,我更新了KeyboardEvent.metaKey MDN 上的页面,并注明 Windows 键确实会导致 metaKey是真的(您可能必须按 Ctrl-F5 来刷新页面)。

在协调 documentation page for nsIDOMWindowUtils使用源代码( nsIDOMWindowUtilsUIEvent.cpp ),我注意到在源代码中添加了额外的修饰符代码,包括 MODIFIER_OS表示 Windows 键与“元”键分开。我没有调查究竟是什么时候做出这个改变的。

如果您想知道在您正在处理的事件发生时按下了 Windows 键,您将不得不在两个 keydown 上使用处理程序。和 keyup监视和跟踪 Windows 键的当前状态。

典型的 Windows 事件(keydown 完整显示):

以下是在监控 keydown 时按下并释放 Windows 键后的控制台日志。 , keypress inputkeyup事件。

Windows  key <code>keydown</code> event

Firefox Windows-z 的典型事件:

Firefox Typical events for Windows-z

适用于 Windows-z 的 Chrome 典型事件:

Chrome Typical events for Windows-z

使用 Windows 键作为修饰符:
正如您在上面的屏幕截图中看到的那样,您在 Firefox 或 Chrome 中都没有获得 Windows-z 的完整事件序列。与其他键组合相比,两者都缺少 keydown z 的事件。我不清楚为什么没有触发该事件。我怀疑它被Windows吞下了。

使用 Windows 键会有问题。 Windows 将对许多组合键使用react,包括那些只是由用户执行的轻微错误键控,而用户没有按要求那么小心。您最好使用不同的修饰键或不包含 Windows 键的修饰键组合。

另一个例子:Alt-Windows-z 得到一个完整的序列 3 keydown事件,一个 keypress事件和 3 keyup Firefox 中的事件,而在 Chrome 中,序列不会触发 keypress事件。

一般键盘快捷键:
已分配给不同任务的组合键因操作系统、浏览器和用户而异。一般来说,如果您想在您通常发布的附加组件中使用键盘快捷键,最好的做法是使用默认键盘快捷键,但允许用户选择定义每个操作使用的快捷键,或者即使该操作有快捷方式。现实情况是,用户会遇到与其他应用程序和浏览器扩展的冲突。根据您正在编写的扩展程序类型,此时可能会或可能不会更改键盘快捷键。

关于javascript - Firefox 可以检测 MetaKey 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292111/

相关文章:

javascript - ng-repeat 中的 Angular js 条件类

javascript - 使用 jQuery 创建 HTML 元素 : what’s the correct approach?

javascript - 从 Web 应用程序中的任何网页捕获扫描的条形码

javascript - 如何在按钮单击时停止 Firefox 插件?

javascript - 火狐插件。如何判断数组元素是文件还是目录?

javascript - 使用 onclick 显示具有相同 div 类名的 2 个 div 的内容

c++ - 确定 NPAPI 中的浏览器代理设置以下载页面 SSL 证书

javascript - 显示带有 Firefox 扩展的页面

javascript - JS Facebook API 请求似乎中断了 session

javascript - 在 Firefox 附加组件 SDK 中使用 port.on 传递数据