%20%D0%BD%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%D0%B2%20Firefox%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%D0%BC%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%89%D0%B5%D0%BD%D0%BE%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D1%82%D1%8C%20%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%88%20(%D0%BD%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20permissions.default.shortcuts%20%3D%202).png)
Значение по умолчанию для 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 Key Event Tester (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
если permissions.default.shortcuts = 0
(т.е. когда Delete
работает так, как ожидается), но только
keyup keyCode=46 (.) which=46 (.)
key=Delete
если permissions.default.shortcuts = 2
(т.е. когда Delete
ничего не делает в полях ввода текста). То есть keyup присутствует, но keydown отсутствует. (Что странно.)
Итак, мой главный вопрос:Как запретить веб-сайтам переопределять настоящие сочетания клавиш Firefox, которые действительно что-то делают, не нарушая работу Delete
?
Несколько технических подробностей о моей системе (могу предоставить больше, если это будет полезно, хотя тот факт, что я получил похожие (или худшие) результаты на двух других (библиотечных) компьютерах, говорит о том, что это, вероятно, не зависит от системы или оборудования): я использую Firefox 71.0 (64-разрядную версию), на Ubuntu (18.04.1), на ноутбуке 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"
Как Backspace
также (и дополнительно) сломано в 66.0.1 и более ранних версиях: Что произойдет, если вы нажметеBackspace
безфокусировка на поле ввода текста управляется с помощью browser.backspace_action
. 0
(по умолчанию в Windows) означает «перейти на предыдущую страницу», 1
означает «прокрутить вверх» и 2
означает «ничего не делать».
Однако в версиях Firefox до 66.0.2 или 66.0.3 (я не уверен, какой именно) настройка 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», которую я наблюдал, на самом деле не была связана с операционной системой, а была результатом того, что версия Firefox, установленная в моей университетской библиотеке на компьютерах с Windows (66.0.1), немного отставала от версии на компьютерах Mac (66.0.3) и значительно отставала от версии на моем компьютере с Linux (71.0.1).
Я отправил новый баг в Bugzilla,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970, с патчем выше. Так что, надеюсь, ответ на этот вопрос скоро будет просто "Обновите Firefox".
Но даже когда это произойдет, я планирую оставить этот вопрос (и ответ), чтобы любой, кто застрял со старой версией Firefox и случайно наткнулся на нее, мог извлечь пользу. Потому что это относительно простое (хотя и довольно затратное по времени ЦП), но едва ли интуитивное решение неприятной проблемы.