Как запретить сайтам красть сочетания клавиш в Firefox

Вопрос или проблема

Множество веб-сайтов, особенно те, которые используют редактирование богатого текста (в этом сайте тоже есть вина), крадут сочетания клавиш, обычно используемые для управления Firefox, и заставляют их делать что-то другое. Это совершенно выворачивает наизнанку, когда я нажимаю что-то вроде Cmd-число, Cmd-L, Cmd-T или Cmd-K, и это не делает то, что я хочу. Могу ли я это остановить?

На самом деле, было бы, наверное, лучше запретить использование всех сочетаний клавиш Cmd-*. Я никогда не видел, чтобы они использовались для чего-то полезного. Это возможно?

Благодаря новому свойству @run-at в Greasemonkey это теперь возможно!

Я вдохновился этим скриптом и этим скриптом, чтобы объединить их в Userscript, который успешно перехватывает сочетания клавиш Ctrl+T и Ctrl+S. Я тестировал его в Firefox 17 ESR и Firefox 25.

// ==UserScript==
// @name           Отключить перехват Ctrl+s и Ctrl+t
// @description    Остановить веб-сайты от захвата сочетаний клавиш
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

// Код клавиши для 's' и 't'. Добавьте больше, чтобы отключить другие перехваты ctrl+X
keycodes = [83, 84];  

(window.opera ? document.body : document).addEventListener('keydown', function(e) {
    // alert(e.keyCode ); //раскомментируйте, чтобы найти больше кодов клавиш
    if (keycodes.indexOf(e.keyCode) != -1 && e.ctrlKey) {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    // alert("Gotcha!"); //раскомментируйте, чтобы проверить, видит ли он комбинацию
    }
    return false;
}, !window.opera);

11 лет после подачи отчета об ошибке Mozilla, наконец, принялась за эту популярную просьбу о функции, и, похоже, она теперь работает нормально (тестировалось в Firefox 66.0.3/Ubuntu).

(Спасибо @PerJohansson за указание на то, что они сделали настройку намного труднее найти с тех пор, как FF 59.)

Я только что обновил этот ответ более простыми шагами, протестированными на Firefox 75.

ПРИМЕЧАНИЕ: если вы хотите отключить сочетания клавиш для всех сайтов по умолчанию, перейдите в about:config и установите значение permissions.default.shortcuts на 2. Спасибо @inetknght за совет, который также задокументирован здесь: https://support.mozilla.org/en-US/questions/1241294#answer-1175070

Чтобы отключить сочетания клавиш для конкретного сайта:

  1. Нажмите Ctrli (или выберите Инструменты > Информация о странице) для отображения окна информации о странице
  2. Выберите вкладку Разрешения Окно информации о странице Firefox
  3. Отрегулируйте настройку Переопределить сочетания клавиш. Вкладка Разрешения Firefox

Mozilla имеет больше информации об окне Информация о странице здесь:

https://support.mozilla.org/en-US/kb/firefox-page-info-window

И если вам интересна история этого исправления, вот связанные билеты Mozilla:
https://bugzilla.mozilla.org/show_bug.cgi?id=380637 и
https://bugzilla.mozilla.org/show_bug.cgi?id=1445942

Обширные исследования показывают, что с текущей версией Firefox (3.6.x) это невозможно – все конфликты привязки клавиш разрешаются с приоритетами: Система > Веб-сайт > Firefox – довольно глупый порядок. Ни одно из дополнений, которые я пробовал, похоже, не может это исправить.

В будущем это может стать возможным, но сейчас ответ – невозможно.

Поскольку проблема, похоже, заключается в том, что события клавиатуры JavaScript крадут нажатия клавиш, разве не возможно создать скрипт JavaScript (для использования через Greasemonkey), который освобождает все эти события клавиатуры, тем самым возвращая правильное использование каждого сочетания клавиш браузеру?

Я не уверен, насколько это осуществимо, но кто-то с большим опытом JavaScript / Greasemonkey может помочь (может быть, стоит спросить на SO).

Проблема в том, что любая страница может запускать Javascript, который устанавливает обработчик событий для захвата событий нажатия клавиш, и элементы управления javascript в Firefox недостаточно тонкие, чтобы остановить это, не нарушая другие функции javascript.

Единственный способ предотвратить это – отключить Javascript (Инструменты -> Параметры, вкладка [Содержимое], снимите флажок Включить JavaScript). Или вы можете отключить Javascript для конкретного сайта с помощью расширения, такого как NoScript.

Firefox позволяет вам предотвратить определенные использования Javascript, такие как перемещение/изменение размеров окон, изменение или отключение контекстного меню и т.д.; но нет ничего, чтобы предотвратить веб-сайты от перехвата событий клавиатуры.

Возможно, есть расширение, которое дает такой уровень контроля – я о таком не слышал.
Есть Javascript Options, но это расширение больше не обновляется.

Чтобы предотвратить всем сайтам перехватить сочетания клавиш (кроме специфических разрешений для сайтов), установите permissions.default.shortcuts на 2 в about:config или prefs.js.

Вы все еще можете позволить сайтам, которым доверяете, брать на себя сочетания клавиш по мере необходимости, см. этот другой ответ о том, как переопределить.

Предпочтение по умолчанию равно 0 (не указанное значение для этого и других разрешений, фактическое значение по умолчанию установлено где-то в коде и позволяет красть сочетания клавиш), 1 (разрешить кражу сочетания клавиш) или 2 (запретить). 3 (предупредить) – это неподходящее значение для этого разрешения на сайт.

После множества тестов в различных браузерах легче перехватывать клавиши, когда они находятся нажатиями (не нажата), потому что некоторые из этих “интегрированных в приложение клавиш” трудно перехватить с помощью события “нажатие клавиши”.

Я придумал этот скрипт, который является своего рода кроссбраузерной совместимостью (я не тестировал для Internet Explorer от Microsoft). Обратите внимание, что браузеры возвращают разные коды для некоторых клавиш. В моем случае я хотел предотвратить Ctrl+P.

Клавиша “P” в Chrome рассматривается как e.keyCode == 80, в Opera это 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("Пожалуйста, используйте кнопку Печать PDF ниже для лучшего отображения документа");
        e.cancelBubble = true;
        e.preventDefault();

        e.stopImmediatePropagation();
    }  
});

Я использовал jQuery.

Если вы хотите отключить любое использование ctrl-клавиши веб-страницей, просто отфильтруйте все коды букв от a до z
(строя на ранее принятом и работающем ответе)

// ==UserScript==
// @name           Отключить перехват Ctrl+клавиша
// @description    Остановить веб-сайты от захвата сочетаний клавиш
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

(window.opera ? document.body : document).addEventListener('keydown', function(e) {
    //alert(e.keyCode ); //раскомментируйте, чтобы найти больше кодов клавиш
    if( e.ctrlKey && e.keyCode>=65 && e.keyCode<=90 ) {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    }
    return false;
}, !window.opera);

Вероятно, сторонние плагины перехватывают фокус от основного окна браузера. В этом случае ввод с клавиатуры (за исключением прерываний) будет перехвачен плагином. Если вам это не нравится, вы всегда можете удалить нарушающие плагины [Я предположу, что это скорее всего Flash].

Возможно, вы можете использовать Autohotkey или Autoit, одну из этих программ, и если вы сможете делать комбинации горячих клавиш и связывать их с функциями Firefox, например

Ctrl-; T на новую вкладку

Ctrl-; N на новое окно и так далее.

Я не знаю, как использовать Autohotkey или Autoit, так что кто-то другой должен будет подтвердить, что это может работать, я только предлагаю это как потенциальную идею.

Строя на ответе @Martin J.H. выше, был создан следующий userscript, потому что Outlook Web перехватывал клавиши Alt+стрелка (а позже просто клавиши Alt) на MacOS. Он должен предоставить стартовый шаблон для создания вашего собственного userscript.

Просто раскомментируйте блок alert в функции обработчика (возможно, изменив его на console.log, чтобы это было менее раздражающе), чтобы проверить коды событий, которые вам нужны, и добавьте их в массив в начале файла.

Вам, конечно, понадобится менеджер userscript, такой как Greasemonkey, Tampermonkey (ниже тестировалось с ним) или Violentmonkey. Greasyfork имеет список браузеров и доступных плагинов.

// ==UserScript==
// @name           Исправить перехват горячих клавиш Outlook на Mac
// @description    Отключает Outlook от перехвата сочетаний клавиш Mac
// @copyright      2024, phonique (https://github.com/phonique/userscript-stop-outlook-hijack/)
// @homepageURL    https://github.com/phonique/userscript-stop-outlook-hijack
// @version        0.1.0
// @run-at         document-start
// @match          https://outlook.office.com/*
// @grant          none
// @license        MPL-2.0
// ==/UserScript==

// коды событий для клавиш стрелок (добавьте свои здесь).
var eventCodes = ["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"];

// Возможные события клавиатуры: нажатие клавиши, отпускание клавиши, нажатие клавиши вниз
// в настоящее время Outlook, похоже, требует только нажатия клавиши и отпускания клавиши.
// Только `нажатие клавиши` недостаточно для отключения перехвата клавиш Alt.

// Мы включаем useCapture здесь, потому что хотим захватить событие, пока
// оно течет вниз по DOM, а затем игнорировать других слушателей, которые перехватывают
// нашу стандартную функциональность Alt с помощью вызовов cancelBubble()
// и stopImmediatePropagation().
// см. здесь: https://stackoverflow.com/questions/5657292/why-is-false-used-after-this-simple-addeventlistener-function/25591239#25591239

window.addEventListener('keydown', handler, true); // useCapture true, т.е. мы захватываем событие, пока оно течет вниз
window.addEventListener('keyup', handler, true); // useCapture true
// для Outlook это не нужно, но вам может понадобиться для вашего использования
// window.addEventListener('keypress', handler, true);

function handler (e) {
     // alert("eventCode: " + e.code + " eventKey: " + e.key); // отладка здесь

     // Если вы хотите полностью отключить перехват Alt, а не только в текстовых полях
     // раскомментируйте следующее и закомментируйте (или удалите) строку, следующую за ним.
     // if (e.code === "AltRight" || e.code === "AltLeft" || e.key === "Alt") {
     if ((e.code === "AltRight" || e.code === "AltLeft" || e.key === "Alt") && typeof(document.activeElement.role) !== 'undefined' && document.activeElement.role == 'textbox') {
         e.cancelBubble = true;
         e.stopImmediatePropagation();
     }
     // включая предыдущие исправления UX
     if (eventCodes.indexOf(e.code) != -1 && e.shiftKey && e.altKey) {
         e.cancelBubble = true;
         e.stopImmediatePropagation();
     }
     if (eventCodes.indexOf(e.code) != -1 && e.altKey) {
         e.cancelBubble = true;
         e.stopImmediatePropagation();
     }
     if (eventCodes.indexOf(e.code) != -1 && e.shiftKey && e.metaKey) {
         e.cancelBubble = true;
         e.stopImmediatePropagation();
     }
     if (eventCodes.indexOf(e.code) != -1 && e.shiftKey && e.ctrlKey) {
         e.cancelBubble = true;
         e.stopImmediatePropagation();
     }
}

Текущая версия Firefox позволяет нам "отключать javascript для захвата контекстного меню":

Инструменты/Параметры/Содержимое/Включить JavaScript Дополнительно/Отключить или заменить контекстные меню

Но нет функции "отключить javascript для захвата сочетаний клавиш".

пс. Я ненавижу сайт Twitter, его сочетания клавиш конфликтуют с моими системными сочетаниями клавиш: J, K, L, I

Я создал запрос на функцию на bugzilla.mozilla.org, пожалуйста, прокомментируйте там:
https://bugzilla.mozilla.org/show_bug.cgi?id=775002

Ответ или решение

Чтобы запретить вмешательство веб-сайтов в сочетания клавиш (keyboard shortcuts) в браузере Firefox, существует несколько подходов, каждый из которых имеет свои особенности и применения. В этой статье мы рассмотрим наиболее эффективные методы, чтобы вы могли управлять сочетаниями клавиш и вернуть их в распоряжение браузера.

1. Использование настройки в about:config

Наиболее простым и универсальным способом запрета перехвата сочетаний клавиш является настройка браузера напрямую через конфигурацию.

  1. В адресной строке наберите about:config и нажмите Enter.
  2. Примите предупреждение о рисках.
  3. В строке поиска найдите параметр permissions.default.shortcuts.
  4. Установите значение 2, чтобы отключить перехват сочетаний клавиш всеми сайтами.

Значения параметра имеют следующее значение:

  • 0: позволяет перехват сочетаний клавиш,
  • 1: запрещает перехват,
  • 2: официальный запрет.

2. Персонализированные скрипты с помощью Greasemonkey или Tampermonkey

Кроме изменения конфигураций, вы можете создать пользовательский скрипт, который будет блокировать определенные сочетания клавиш. Для этого потребуется расширение, такое как Greasemonkey или Tampermonkey.

Вот пример скрипта, который предотвращает перехват сочетаний Ctrl + S и Ctrl + T:

// ==UserScript==
// @name           Disable Ctrl+s and Ctrl+t interceptions
// @description    Stop websites from hijacking keyboard shortcuts
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

keycodes = [83, 84];  

(document.body || document).addEventListener('keydown', function(e) {
    if (keycodes.indexOf(e.keyCode) !== -1 && e.ctrlKey) {
        e.stopPropagation();
        e.preventDefault();
    }
}, false);

Этот скрипт проверяет нажатые клавиши и, если сочетание совпадает с заданными, блокирует дальнейшие действия.

3. Установка разрешений для отдельных сайтов

Если вы хотите запрещать перехват сочетаний клавиш только для определенных сайтов, вы можете использовать функцию "Информация о странице":

  1. Нажмите Ctrl + I, или щелкните правой кнопкой мыши по странице и выберите "Информация о странице".
  2. Перейдите на вкладку "Разрешения".
  3. Найдите параметр "Переопределить сочетания клавиш" и измените настройку на "Запретить".

Таким образом, можно управлять разрешениями на уровне отдельных сайтов.

4. Отключение JavaScript

Если вы не хотите, чтобы какой-либо сайт взаимодействовал с вашими сочетаниями клавиш, вы можете полностью отключить JavaScript. Для этого:

  1. Перейдите в "Настройки" → "Конфиденциальность и безопасность".
  2. Найдите настройку "JavaScript" и отключите ее.

Имейте в виду, что отключение JavaScript может привести к ухудшению работы большинства сайтов, так как многие из них требуют этого языка для корректного функционирования.

Заключение

Управление сочетаниями клавиш в браузере Firefox может быть достигнуто разными способами. Выбор метода зависит от ваших потребностей — хотите ли вы запретить перехват на всех сайтах или только на определенных. Используйте предоставленные выше рекомендации для достижения оптимального результата. Убедитесь, что ваши действия соответствуют вашему стилю работы и делают использование браузера более комфортным и эффективным.

Примечание

Подробную информацию об тонкостях настройки Firefox можно найти на официальном сайте поддержки Mozilla.

Оцените материал
Добавить комментарий

Капча загружается...