Как запретить посещенным страницам перекрывать выбранные сочетания клавиш Firefox?

40

В Firefox, как я могу запретить страницам переопределять встроенные сочетания клавиш Firefox через Javascript для каждой клавиши? Желательно для каждого сайта тоже? Самое неприятное переопределение - это косая черта ('/'), которая связана с "Найти на странице". Такие сайты, как результаты поиска Google, временные рамки Twitter, некоторые вики и другие страницы, крадут ключ слеша для своих собственных окон поиска, что совершенно неверно.

Поскольку мой представитель позволяет мне задавать, редактировать и отвечать на вопросы, но не добавлять комментарии, это в основном дубликат этих двух других вопросов, на которые не был дан правильный ответ:

Как остановить веб-сайт для переопределения моих сочетаний клавиш

Firefox: не разрешать веб-сайтам переопределять ключ / (косая черта)

Безопасный Шел
источник
1
Я разочарован PHPMyAdmin, переопределяющим ctrl- <стрелка влево> ... это хороший вопрос
Сильно нерегулярный
1
Я терпеть не могу сайты, которые отменяют поведение по умолчанию. Многие делают это с помощью средних кликов. Посмотрите этот связанный вопрос для решения этой проблемы.
Кэм Джексон

Ответы:

12

Основываясь на ответе edymtt, я создал пользовательский скрипт, который отключает только определенные сочетания клавиш. Вы можете добавить дополнительные сочетания клавиш, чтобы отключить их, добавив коды ключей в массив кодов клавиш, или ограничить сайты, к которым они применяются, заменив @includeтег одним или несколькими шаблонами.

Установите с помощью greasemonkey .

// ==UserScript==
// @name           Disable keyboard shortcuts
// @description    Stop websites from highjacking keyboard shortcuts
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

keycodes = [191] // Keycode for '/', add more keycodes to disable other key captures

document.addEventListener('keydown', function(e) {
//    alert(e.keyCode); //uncomment to find out the keycode for any given key
    if (keycodes.indexOf(e.keyCode) != -1)
    {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    }
    return false;
});
MikeFHay
источник
2
Потрясающе! Также почти полное решение для мета-ключей - я пытался удержать Google Docs от перехвата Previous-tab (Cmd + Left) и Next-tab (Cmd + Right) и обнаружил, что мне также нужно установить true для useCapture; т.е. document.addEventListener ('keydown', yourHandlerFn, true)
chbrown
1
обратите внимание, что значение 191зависит от вашей раскладки клавиатуры, что касается моей настройки azerty (у меня 16 + 58 для альфа-области и 111 для цифровой клавиатуры)
sylvainulg
2
и, к сожалению, в настоящее время больше не работает (проверено на phabricator и twitter). пользовательский слушатель срабатывает, но событие сайта все равно срабатывает, и «поиск по странице» не отображается.
sylvainulg
1
@sylvainulg Я вижу, что он не работает в Twitter, но, по крайней мере, он все еще работает на GitHub. Интересно, что изменилось.
Бинки
Это работает везде, где я пробовал, кроме php.net. Интересно, какое событие они используют.
qwazix
8

Что касается Google и ярлыка быстрого поиска, вы можете установить этот скрипт Greasemonkey:

http://userscripts-mirror.org/scripts/show/132237

Как говорится в описании, он «мешает Google сфокусировать поисковый ввод при каждом нажатии клавиши» - в частности, если вы нажмете /с фокусом клавиатуры вне поля поиска, появится Быстрый поиск, как и на других веб-сайтах.

Я только установил его, не касаясь кода, но я думаю, что он может быть легко адаптирован для работы с другими сайтами и / или другими ярлыками.

edymtt
источник
Для пояснения: этот пользовательский скрипт останавливает ВСЕ горячие клавиши на страницах, для которых он включен, сохраняя собственные функциональные возможности браузера. Чтобы применить его к другим сайтам, просто добавьте больше тегов @include.
MikeFHay
без какой-либо информации о том, что скрывается за ссылкой, ответ, к сожалению, бесполезен, когда userscripts-mirror.org выходит из строя, блокируется брандмауэром или чем-то еще.
sylvainulg
8

Начиная с Firefox 58 можно отключить переопределение сочетаний клавиш для каждого веб-сайта.

«Переопределить сочетания клавиш» и многие другие разрешения доступны в «Информация о странице -> Разрешения» (под значком информации в строке URL-адреса).

Пример разрешений Firefox для superuser.com

Переопределение клавиатуры было введено в Firefox # 380637

Алек Истомин
источник
1
Да, после 11 лет они, наконец, сделали полдела по ремонту этого билета. К сожалению , текущая реализация (еще в FF 59) полностью отключает Backspaceи Deleteключи, которые действительно отстой.
Ламбарт
6
Кроме того, к сожалению, это не мешает веб-страницам захватывать несмещенный (то есть, нет Ctrl, Shiftили Altключ) ввод - это означает, что это совсем не помогает с косой чертой, упомянутой в исходном вопросе.
Ламбарт
@Lambart - приятно знать, что в конечном итоге я тоже этим не пользовался, поскольку сочетания клавиш Firefox стали фиксированными в jira и слиянии (где-то около firefox 59)
Алек Истомин
2
что было исправлено? JIRA и Confluence по-прежнему захватывают все виды ключей, которые постоянно нарушают мой рабочий процесс. Я рассматриваю это как проблему Atlassian: им нужно разрешить людям отключать (и / или менять) свои «ярлыки».
Ламбарт
firefox bugzilla.mozilla.org/show_bug.cgi?id=1433592 исправленные продукты atlassian для меня (возможно, были исправления atlassian в тот же период времени)
Алек Истомин
0

Вот более общий сценарий - вы можете определить любое количество событий нажатия клавиш для отключения.

https://greasyfork.org/en/scripts/5819-disable-website-keyboard-hooks

// ==UserScript==
// @name           Disable website keyboard hooks
// @description    Stop websites from hijacking keyboard shortcuts.
// @author         Isaac Levy
// @run-at         document-start
// @include        *
// @grant          none
// @version        0.0.1
// @namespace      https://isaacrlevy.com
// ==/UserScript==

var keycodes = [ // Add keycodes as desired, keep sorted.
    37, 38, 39, 40 // Arrow keys.
]

var meta_keycodes = [ // Disable these when meta key is pressed.
    70
];

// Don't change below this line.

var isMac = navigator.platform.toLowerCase().indexOf('mac') >= 0;

// Create a fast lookup.
// This saves work during normal typing. Maybe unnecessary.
var keycode_offset = keycodes[0];
var keycode_arr = Array(keycodes[keycodes.length - 1] - keycode_offset)
for (var i = 0, len = keycodes.length; i < len; i++) {
    keycode_arr[keycodes[i] - keycode_offset] = true;
}

document.addEventListener('keydown', function(e) {
    //console.log(e);
    if ((isMac && e.metaKey) || (!isMac && e.ctrlKey)) {
        if (meta_keycodes.indexOf(e.keyCode) >= 0) {
            e.stopImmediatePropagation();
        }
    } else if (keycode_arr[e.keyCode - keycode_offset]) {
        e.stopImmediatePropagation();
    }
    return false;
});
vackamole
источник
Извините, но я не могу заставить это работать. Особенно я хочу отключить клавиши со стрелками влево и вправо на сайте - но с помощью этого скрипта клавиши со стрелками по-прежнему контролировать сайт ???
Кристиан Херенц
-3

Надстройка YesScript стала для меня беспроблемным решением. Это предотвращает запуск сайтов на JavaScript, но только на тех сайтах, которые вы выбираете. В большинстве случаев эти сайты перехватывают сочетания клавиш с помощью JavaScript. Я узнал об этом в форме статьи Ghacks.net.

Братья феникс
источник