Как запретить кражу сочетаний клавиш сайтами в Firefox
Многие веб-сайты, особенно все, что связано с редактированием текста (этот сайт также виновен), крадут сочетания клавиш, обычно используемые для управления Firefox, и заставляют их делать что-то еще. Это полностью бесит, когда я нажимаю что-то вроде Cmd-номера, Cmd-L, Cmd-T или Cmd-K, и это не делает то, что я хочу. Могу ли я сделать это остановить?
На самом деле, было бы лучше, если бы я мог запретить кражу всех сочетаний клавиш Cmd-*. Я никогда не видел, чтобы они использовали что-то полезное. Является ли это возможным?
11 ответов
Благодаря новому Greasemonkey @run-at
собственность, это теперь возможно!
Я черпал вдохновение из этого сценария и этого сценария, чтобы объединить их в пользовательский сценарий, который успешно перехватывает сочетания клавиш Ctrl+T и Ctrl+S. Я тестировал в Firefox 17 ESR и Firefox 25.
// ==UserScript==
// @name Disable Ctrl+s and Ctrl+t interceptions
// @description Stop websites from highjacking keyboard shortcuts
//
// @run-at document-start
// @include *
// @grant none
// ==/UserScript==
// Keycode for 's' and 't'. Add more to disable other ctrl+X interceptions
keycodes = [83, 84];
(window.opera ? document.body : document).addEventListener('keydown', function(e) {
// alert(e.keyCode ); //uncomment to find more keyCodes
if (keycodes.indexOf(e.keyCode) != -1 && e.ctrlKey) {
e.cancelBubble = true;
e.stopImmediatePropagation();
// alert("Gotcha!"); //ucomment to check if it's seeing the combo
}
return false;
}, !window.opera);
Через 11 лет после того, как ошибка была обнаружена, Mozilla наконец-то приступила к работе над этим популярным запросом, и похоже, что теперь он работает нормально (протестировано в Firefox 66.0.3 / Ubuntu).
(Спасибо @PerJohansson за то, что они указали, что они значительно усложнили настройку после FF 59.)
Вы можете отключить ярлыки сайта, выполнив следующие действия:
- Нажмите на
(i)
значок в строке адреса - Нажмите на маленькую стрелку (
>
) справа от элемента состояния "Соединение". - Теперь вы должны увидеть
More Information
внизу. Нажмите на нее, и вы, наконец, доберетесь доPage Info
Диалог. - Наконец, перейдите к
Permissions
вкладка и настроитьOverride Keyboard Shortcuts
установка.
Вот несколько недавних (май 2019) снимков экрана для каждого шага:
Если вам интересна история этого исправления, вот соответствующие билеты Mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=380637 и https://bugzilla.mozilla.org/show_bug.cgi?id=1445942
Поскольку проблемы, по-видимому, связаны с событиями клавиатуры JavaScript, которые крадут нажатия клавиш, не будет ли возможно создать сценарий JavaScript (который будет использоваться через Greasemonkey), который отменяет привязку всех этих событий клавиатуры, возвращая, таким образом, правильное использование каждого ярлыка для браузера?
Я не уверен, насколько это возможно, но кто-то с большим опытом JavaScript / Greasemonkey может помочь (возможно, стоит спросить о SO).
Обширные исследования показывают, что в текущей версии Firefox (3.6.x) это невозможно - все конфликты связывания ключей разрешаются с приоритетами: Система> Веб-сайт> Firefox - довольно глупый порядок. Кажется, ни один из аддонов, которые я пробовал, не может это исправить.
Возможно, это станет возможным в будущих версиях, но прямо сейчас ответ - невозможно.
Проблема заключается в том, что на любой странице может быть запущен Javascript, который устанавливает обработчик событий для захвата событий нажатия клавиш, а элементы управления Firefox javascript недостаточно детализированы, чтобы остановить его, не нарушая другие функции JavaScript.
Единственный способ предотвратить это - отключить Javascript (Инструменты -> Параметры, вкладка [Содержимое], снимите флажок Включить JavaScript). Или вы можете отключить Javascript для каждого сайта с таким расширением, как NoScript.
Firefox позволяет предотвращать некоторые виды использования Javascript, такие как перемещение / изменение размеров окон, изменение или отключение контекстного меню и т. Д.; но ничто не мешает веб-сайтам перехватывать события клавиатуры.
Возможно есть расширение, которое дает этот уровень контроля - я не знаю ни одного.
Есть опции Javascript, но это расширение больше не обновляется.
Если вы хотите отключить любую клавишу ctrl, принимаемую веб-страницей, просто отфильтруйте все коды букв из az (основываясь на ранее принятом и рабочем ответе)
// ==UserScript==
// @name Disable Ctrl+key interceptions
// @description Stop websites from highjacking keyboard shortcuts
//
// @run-at document-start
// @include *
// @grant none
// ==/UserScript==
(window.opera ? document.body : document).addEventListener('keydown', function(e) {
//alert(e.keyCode ); //uncomment to find more keyCodes
if( e.ctrlKey && e.keyCode>=65 && e.keyCode<=90 ) {
e.cancelBubble = true;
e.stopImmediatePropagation();
}
return false;
}, !window.opera);
После многочисленных испытаний в различных браузерах легче перехватывать клавиши, когда они нажаты (не нажаты), потому что некоторые из этих "встроенных в приложение клавиш" трудно перехватить с помощью события "нажатие клавиши".
Я придумал этот сценарий, который совместим с несколькими браузерами (я не тестировал IE для Microsoft). Обратите внимание, что браузеры возвращают разные коды для некоторых ключей. В моем случае я хотел предотвратить Ctrl+P.
Клавиша "P" на хроме выглядит как e.keyCode == 80
в опере это e.charCode == 16
в то время как на Firefox это e.charCode == 112
$(document).on('keydown', function(e) {
if(e.ctrlKey && (e.key == "p" || e.charCode == 16 || e.charCode == 112 || e.keyCode == 80) ){
alert("Please use the Print PDF button below for a better rendering on the document");
e.cancelBubble = true;
e.preventDefault();
e.stopImmediatePropagation();
}
});
Я использовал jQuery.
Вероятно, что сторонние плагины фокусируются из главного окна браузера. В этом случае ввод с клавиатуры (кроме прерываний) будет перехвачен плагином. Если вам это не нравится, вы всегда можете удалить нарушающий плагин (-ы) [я бы предположил, что он, вероятно, мигает].
Чтобы запретить всем сайтам переопределять ярлыки (за исключением переопределения разрешений для конкретных сайтов), установитеpermissions.default.shortcuts
к2
вabout:config
илиprefs.js
.
Вы по-прежнему можете разрешить сайтам, которым вы доверяете, использовать ярлыки в каждом конкретном случае. О том, как это переопределить, см. в другом ответе .
По умолчанию это предпочтение равно 0 (неуказанное значение для этого и других разрешений, фактическое значение по умолчанию установлено где-то в коде и разрешает кражу ярлыков), 1 (разрешить кражу ярлыков) или 2 (запретить). 3 (приглашение) не является допустимым значением для этого разрешения сайта.
Текущая версия Firefox позволяет нам "отключить контекстное меню JavaScript для захвата":
Инструменты / Параметры / Содержимое / Включить Javascript Advanced/ Отключить или заменить контекстные меню
Но нет функции "отключить JavaScript, чтобы угнать горячие клавиши".
пс. Я ненавижу твиттер-сайт, его сочетания клавиш конфликтуют с моими системными сочетаниями клавиш: J, K, L, I
Я сделал запрос на функцию bugzilla.mozilla.org, пожалуйста, оставьте комментарий здесь: https://bugzilla.mozilla.org/show_bug.cgi?id=775002
Возможно, вы можете использовать Autohotkey или Autoit, одну из этих программ, и если вы можете делать комбинации горячих клавиш и связывать их с функциями Firefox, скажем,
Ctrl-; T
на новую вкладку
Ctrl-; N
в новое окно и так далее.
Я не знаю, как использовать Autohotkey или Autoit, поэтому кто-то еще должен будет убедиться, что это может работать, я предлагаю это только как потенциальную идею.