permissions.default.shortcuts
的默认值为0
,这允许网页覆盖 Firefox 对键盘快捷键的正常响应。例如,Ctrl-R 通常会重新加载页面,但如果permissions.default.shortcuts = 0
,则 Outlook Web Access 会将 Ctrl-R 解释为“回复此邮件”。
当保留此默认值时,Backspace
和Delete
按钮将按预期工作,无论是在 URL 和搜索栏中,还是在网页上的文本输入字段中:Backspace
删除文本光标左侧的字符,Delete
删除文本光标右侧的字符。
设置permissions.default.shortcuts = 2
阻止网站覆盖键盘快捷键,这样(例如)Ctrl-R 将始终重新加载当前页面,无论该页面是什么。(这也可以在每个网站上进行。)但它也有一个奇怪的副作用:按钮Delete
在 URL 和搜索栏中使用时继续工作,但在文本输入字段中使用时不执行任何操作。没有崩溃或异常行为;文本只是保持不变。
在 Firefox 66.0.3 及更高版本中,Backspace
可以继续正常运行。相比之下,在 Firefox 66.0.1 及更早版本中,Backspace
问题更加严重Delete
(详情见最后)。
注意:现在接受的答案包含(部分)解决方案,而这个问题的其余部分主要是我提供的信息,旨在帮助其他人找出问题所在以及如何解决它。因此,如果你正在阅读这个问题,因为你自己也遇到了这个问题,并且需要一个解决方案,那么你可以从这里跳到接受的答案,如果这不能解决您的问题,或者您很好奇,则仅阅读问题的其余部分。
可能相关:Mozilla 的键盘快捷键列表(https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly) 在“编辑”部分中包含以下内容:
Command Shortcut
Delete Del
我不知道这怎么能被认为是一种“快捷方式”,而不是正常的文本输入(值得注意的Backspace
是,不是在编辑部分中列为“快捷方式”),为什么不允许网站“覆盖”它会导致什么都不发生,而不是某物被删除。但是将Del
/Delete
列为键盘快捷键似乎可能与原因(不允许网站覆盖键盘快捷键)和结果(Delete
在网站上的文本输入字段中不起作用)之间存在联系。
我还验证了,没有必要让网站真正尝试覆盖任何东西(根本)来观察这个错误;下面的 HTML 就足够了(Delete
如果 则按预期工作permissions.default.shortcuts = 0
,如果 则不执行任何操作permissions.default.shortcuts = 2
):
<!DOCTYPE html>
<html>
<body>
Text box: <input type="text">
</body>
</html>
这种行为在很多实际网站上也都存在(我已确认 Stack Exchange、Google 和我所在大学的 Outlook Web App 电子邮件页面),而且我还没有发现任何不发生这种情况的网站。无论我使用笔记本电脑内置键盘或 USB 键盘上的删除按钮,都会发生这种情况。
最后,我在 Javascript 按键事件测试器中观察到了以下结果 (https://unixpapa.com/js/testkey.html)(不抑制任何内容,显示所有属性值,在输入之前文本输入框处于聚焦状态):
Backspace
给出:
keydown keyCode=8 which=8 charCode=0
shiftKey=false ctrlKey=false altKey=false metaKey=false
key=Backspace char=undefined location=0 repeat=false
keyIdentifier=undefined keyLocation=undefinedkeyup keyCode=8 which=8 charCode=0
shiftKey=false ctrlKey=false altKey=false metaKey=false
key=Backspace char=undefined location=0 repeat=false
keyIdentifier=undefined keyLocation=undefined
无论 的值是多少permissions.default.shortcuts
(或browser.backspace_action
,对于那些阅读下面细则的人来说)。拆分连在一起的行(可能是由于将退格键应用于回车符),并省略在所有这些测试中都相同的属性,得到:
keydown keyCode=8 which=8
key=Backspace
keyup keyCode=8 which=8
key=Backspace
相反,Delete
按压
keydown keyCode=46 (.) which=46 (.)
key=Delete
keyup keyCode=46 (.) which=46 (.)
key=Delete
if permissions.default.shortcuts = 0
(即当Delete
按预期工作时),但只有
keyup keyCode=46 (.) which=46 (.)
key=Delete
if permissions.default.shortcuts = 2
(即,当Delete
文本输入字段中不执行任何操作时)。也就是说,keyup 存在,但 keydown 缺失。(这很奇怪。)
因此,我的核心问题是:如何防止网站覆盖实际的 Firefox 键盘快捷键,而不会破坏它Delete
?
关于我的系统的一些技术细节(如果有用的话我可以提供更多信息,尽管我在另外两台(图书馆)电脑上获得了类似(或更差)的结果,这表明这可能不是系统或硬件特定的):我在 Ubuntu(18.04.1)上使用 Firefox 71.0(64 位),在 Dell Precision 5540 笔记本电脑(i7-9750H)上。我的外接键盘是 Microsoft Natural Ergonomic Keyboard 4000,我没有为其安装任何特殊软件,也没有重新映射任何按键。
cat /etc/default/keyboard
给出
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
在 66.0.1 及更早版本中如何Backspace
(以及额外)损坏:如果你按Backspace
没有聚焦文本输入字段由 控制browser.backspace_action
。0
(Windows 上的默认设置)表示“导航到上一页”,1
表示“向上滚动”,2
表示“不执行任何操作”。
但是,在 66.0.2 或 66.0.3 之前的 Firefox 版本(我不确定是哪个)中,无论文本输入字段是否获得焦点,设置permissions.default.shortcuts = 2
都会使行为相同。Backspace
因此,如果browser.backspace_action
设置为2
,按下Backspace
仍然会像 一样不正常Delete
,但不会更糟。如果browser.backspace_action
设置为1
,情况只会稍微糟糕一点;页面会意外跳出,但不会发生其他事情。但如果设置为0
(这又是 Windows 默认设置!),Backspace
即使文本输入框处于焦点状态,按下 也会离开页面并返回上一个页面!
(我最初认为该Backspace
问题出在 Windows 上,因为我在运行 Windows 和 Firefox 66.0.1 的(大学图书馆)计算机上观察到了该问题,但在运行 MacOS 和 Firefox 66.0.3 的(大学图书馆)计算机上没有观察到(在我自己的运行 Linux 和 Firefox 77.0.1 的计算机上也没有观察到)。但事实证明,两个小版本的差异恰好包含当 Mozilla 的某个人修补了代码以修复适用于 的错误时Backspace
,却忽略了对它(更温和地)所做的一些处理Delete
。)
答案1
立即的解决方案是在应用补丁后从源代码构建 Firefox(对于当前稳定版本 71.0.1,尽管对于许多版本(至少到 66.0.x,并且可能更远)应该是相同的,除了行号和哈希值的差异):
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index c90f3aa340..ffd8727350 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -180,7 +180,7 @@
<key id="key_paste"
key="&pasteCmd.key;"
modifiers="accel"/>
- <key id="key_delete" keycode="VK_DELETE" command="cmd_delete"/>
+ <key id="key_delete" keycode="VK_DELETE" command="cmd_delete" reserved="false"/>
<key id="key_selectAll" key="&selectAllCmd.key;" modifiers="accel"/>
<key keycode="VK_BACK" command="cmd_handleBackspace" reserved="false"/>
对于不说话的人来说diff
,这意味着:在修改文件browser/base/content/browser-sets.inc
以替换行之后
<key id="key_delete" keycode="VK_DELETE" command="cmd_delete"/>
和
<key id="key_delete" keycode="VK_DELETE" command="cmd_delete" reserved="false"/>
正如所指出的https://bugzilla.mozilla.org/show_bug.cgi?id=1445942,类似的问题曾经也存在Backspace
,并在 Firefox 66 的一些子版本中得到了修复。因此,我观察到的“仅限 Windows”问题实际上不是操作系统特有的,而是由于我的大学图书馆在其 Windows 机器上的 Firefox 版本(66.0.1)略微落后于其 Mac 上的版本(66.0.3),并且远远落后于我自己的 Linux 计算机(71.0.1)上的版本。
我已经向 Bugzilla 提交了一个新的错误,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970,使用上面的补丁。因此,希望这个问题的答案很快就会是“升级 Firefox”。
即使发生这种情况,我还是打算保留这个问题(和答案),以便任何使用旧版 Firefox 的人都能从中受益。因为这是一个相对简单(但耗费 CPU 时间)但不太直观的解决棘手问题的方法。