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

57

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

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

выделывать кожу без дубления
источник
4
Согласен, это бесит. FogBugz имеет очень хорошую реализацию сочетаний клавиш. CTRL-;входит в режим быстрого доступа и выделяет все команды, отображаемые на экране, с помощью доступных ярлыков. Каждый ярлык является комбо, поэтому новый регистр CTRL-; Nи редактирование CTRL-; E. Очень легко привыкнуть и ноль конфликтов. Я хотел бы, чтобы больше сайтов использовали что-то подобное, потому что это проще для пользователя и не отменяет ярлыки браузера. Жаль, что SuperUser не делает этого, потому что он от тех же людей, что и FogBugz.
Сэм
См. Также superuser.com/questions/399352/…
Механическая улитка
1
Это обсуждается в этом запросе на Bugzilla .
Механическая улитка
Я посещаю множество страниц интранета на работе, которые каким-то образом портят cmd + N, поэтому я никогда не смогу открыть новые окна браузера с клавиатуры! Так раздражает!
Николас Миари
1
Спустя ~ 12 лет Mozilla стабилизировала довольно разумное решение для этого. Он хорошо скрыт и несовершенен, но может спасти ваше здравомыслие. Пожалуйста, смотрите мой ответ здесь: superuser.com/a/1317514/158390
Ламбарт

Ответы:

24

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

Я черпал вдохновение из этого сценария и этого сценария, чтобы объединить их в пользовательский сценарий, который успешно перехватывает сочетания клавиш 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);
Мартин Дж. Х.
источник
1
Это было очень полезно. Пользователи OS X должны выгрузить e.ctrlKeyдля e.cmdKeyи e.cmdKey && e.shiftKeyвернуть большую часть своих ярлыков браузера.
Джеймс Геко
Этот скрипт работает для меня, чтобы исправить CTRL + TAB путем добавления 9в массив кодов клавиш. Спасибо!
Майк Мюллер,
@JamesGecko Выяснив с помощью этого ответа, вы должны / могли бы использовать e.metaKey для командной клавиши.
riezebosch
3
Этот код работает! Имейте в виду, что он фильтрует не только Ctrl + Key, но также Ctrl + Alt + Key, Ctrl + Shift + Key и Ctrl + Alt + Shift + Key, потому что он проверяет только состояние модификатора Ctrl.
RomanSt
Первый вопрос: для скрипта, который работает на Firefox, почему он проверяет, является ли браузер Opera? И второй вопрос: в комментарии написаны коды символов для «s» и «t», но коды действительно для «S» и «T». Нужно ли указывать код в верхнем регистре по какой-то причине? Благодарю.
Дуглас провел
8

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

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

Вы можете отключить ярлыки сайта, выполнив следующие действия:

  1. Нажмите на (i)значок в строке адреса
  2. Нажмите на маленькую стрелку ( >) справа от элемента состояния «Соединение».
  3. Теперь вы должны увидеть More Informationвнизу. Нажмите на это, и вы, наконец, получите к Page Infoдиалогу.
  4. Наконец, перейдите на Permissionsвкладку и настройте Override Keyboard Shortcutsпараметры.

Вот несколько недавних (май 2019) снимков экрана для каждого шага:

Снимок экрана диалогового окна «Информация о сайте Firefox»

Снимок экрана диалогового окна Firefox Site Security

Снимок экрана с вкладкой «Разрешения Firefox»

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

Lambart
источник
2
В Firefox 64 (не уверен, где он появился), вам нужно нажать «Соединение» => «Дополнительная информация», чтобы получить доступ к этому идентификатору. Зубчатое колесо разрешений входит в настройки, а это не то место.
За Йоханссон
Спасибо @PerJohansson, я обновил билет.
Ламбарт
Какой about:configвариант изменить по умолчанию? Я хочу, чтобы все сайты не могли подключиться к моей клавиатуре
inetknght
5

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

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

выделывать кожу без дубления
источник
1
Использование FF 30.0 почти 4 года спустя, и это все еще проблема. Я попробую идею Мартина Greasemonkey.
LGT
2
Использование FF 53.0 почти 8 лет спустя, и это все еще проблема.
Даниэль
5

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

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

DMA57361
источник
2
Это работает через механизм onKeyPress - Firefox сначала отправляет каждое нажатие на веб-сайт, а затем просматривает его, только если оно не было отменено или перехвачено. Возможно, возможна некоторая магия Greasemonkey, которая перехватывает нажатия клавиш перед сайтом и каким-то образом запускает функции firefox, но это далеко не очевидно.
TAW
4

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

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

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

Возможно есть расширение, которое дает этот уровень контроля - я не знаю ни одного.
Есть опции Javascript , но это расширение больше не обновляется.

NJD
источник
2
Параметры Javascript и некоторые другие расширения, которые я пробовал, не поддерживают это. Блокировка всего javascript сделает сеть практически непригодной для использования, на самом деле это не вариант.
Таил
0

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

Daisetsu
источник
3
Flash тоже это делает, но простой Javascript может украсть ярлыки. Начните новый вопрос здесь и нажмите Cmd-L (Ctrl-L на не-Mac) в текстовом окне вопроса. Вместо того, чтобы переходить к строке URL, как должно быть, ярлык будет украден, и вы увидите диалог вставки гиперссылки. Раньше это было редко, но слишком много сайтов начали делать это в последнее время.
TAW
Я только что попробовал это на Windows 7 под управлением Firefox, и я прыгнул прямо в адресную строку, как обычно.
Daisetsu
Извините, я не совсем понял - это происходит только тогда, когда выбрано диалоговое окно расширенного текстового поля. Ты сделал это? Я тестировал OSX с Firefox, Opera, Safari и Chrome. Во всех четырех обычно Cmd-L переходит на url bar (а Ctrl-L ничего не делает). При редактировании тела вопроса вместо Cmd-L и Ctrl-L отображается диалог вставки гиперссылки.
TAW
Похоже, ты прав. Я понятия не имею, как это предотвратить. :( Это интересный вопрос сейчас , так что я upvoting ваш вопрос Если никто не отвечает это я брошу баунти на него..
Daisetsu
Проблема не с плагинами. Плагины - это отдельная проблема. И другая проблема, в конце концов. В плагинах весь фокус украден плагином, потому что это отдельная сущность. В JavaScript пользовательский интерфейс Firefox представляет собой JavaScript и имеет свои собственные привязки, но сайты могут определять привязки того же уровня. Пока еще нет механизма, чтобы предотвратить это.
njsg
0

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

Я придумал этот сценарий, который совместим с несколькими браузерами (я не тестировал IE для 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("Please use the Print PDF button below for a better rendering on the document");
        e.cancelBubble = true;
        e.preventDefault();

        e.stopImmediatePropagation();
    }  
});

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

Питер
источник
0

Если вы хотите отключить любую клавишу 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);
Стив Хорват
источник
-1

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

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

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

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

Натаниэль Сакс
источник
-2

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

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

Но нет функции «отключить JavaScript, чтобы угнать горячие клавиши».

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

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

diyism
источник