Firefox可以检测到MetaKey吗?

时间:2016-09-02 12:10:24

标签: javascript firefox firefox-addon

我正在使用Firefox扩展程序,并且正在使用元键(键盘上的 Windows 键)。 KeyboardEvent.metaKey应该检测它但总是返回false。 (您可以尝试on MDN或更轻松in the jQuery API docs。)

我可以在Windows 10上使用Firefox 48.0在KDE 16.08 / Gentoo和Firefox 47.0.1上重现这一点。我还尝试了 Ctrl Shift 和<的所有组合kbd> Alt 但没有注册为meta。

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

2 个答案:

答案 0 :(得分:1)

不,是的:
是的,Firefox可以检测 Windows 键,但不能检测到&#34; Meta&#34;键。针对该密钥触发keyupkeydown事件,但不会触发keypress事件。 Chrome也会同样触发事件(无keypress)。 keyCode在Chrome和Firefox上都是相同的,但他们认为关键是两者之间的差异。 Chrome认为关键是&#34; Meta&#34;密钥,而Firefox认为它是&#34; OS&#34;键。因此,Firefox没有将metaKey属性设置为true,因为从Firefox的角度来看,&#34; Meta&#34;钥匙没有按下。

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

在协调KeyboardEvent.metaKey与源代码(documentation page for nsIDOMWindowUtilsnsIDOMWindowUtils)时,我注意到在源代码中添加了其他修饰符代码,包括MODIFIER_OS以表示 Windows 键与&#34; Meta&#34;键。我没有看到这个改变的确切时间。

如果您想知道在处理事件时按下了 Windows 键,则必须在keydownkeyup上使用处理程序用于和跟踪 Windows 键的当前状态。

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

以下是在监控keydownkeypress inputkeyup事件的同时按下并释放 Windows 键后的控制台日志。 / p>

UIEvent.cpp

Firefox Windows的典型事件 - z

Windows  key <code>keydown</code> event

Chrome Windows的典型事件 - z

Firefox Typical events for Windows-z

使用 Windows 键作为修饰符:
正如您在上面的屏幕截图中所看到的,您无法在Firefox或Chrome中获得 Windows - z 的完整事件序列。与其他关键组合相比,它们都缺少 z keydown事件。为什么这个事件没有被解雇我不清楚。我怀疑它被Windows吞噬了。

使用 Windows 键会有问题。 Windows将对许多关键组合做出反应,包括那些只是由用户执行的轻微错误关键的组合,这些关键组合并不像要求那么小心。您可能最好使用不同的修饰键或不包含 Windows 键的修饰键组合。

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

键盘快捷键:
已分配给不同任务的组合键在OS到OS,浏览器到浏览器以及用户到用户之间有所不同。通常,如果您想要在通常发布的附加组件中使用键盘快捷键,最佳操作方法是使用默认键盘快捷键,但允许用户选择定义每个操作使用的快捷方式,或者即使有一个动作的快捷方式。现实情况是,用户将遇到与其他应用程序和浏览器扩展的冲突。根据您所写的扩展类型,此时可能会或可能不会更改键盘快捷键。

答案 1 :(得分:0)

简短回答不,

请注意,Windows上的元键只是 Windows Key windows键。

截至撰写本文时,Firefox 55已发布,但仍无法通过返回false metaKey来检测 Windows Key 按钮属性。 因为bug

我认为你最好使用 shiftKey ,它在事件对象上有一个同名的属性。

相关问题