Как отключить горячие клавиши facebook с расширением Chrome?

Я создал расширение Chrome, которое использует горячие клавиши [Alt]+[0...9] только для того, чтобы обнаружить, что Facebook использует те же горячие клавиши. Есть ли какой-нибудь способ, которым мое расширение могло бы отключить горячие клавиши Facebook, чтобы один только мой огонь? Я вполне уверен, что определил код, который Facebook использует для реализации своих горячих клавиш [Alt]+[0...9]:

document.documentElement.onkeydown=function(a){a=a||window.event;var b=a.target||a.srcElement;var c=a.keyCode==13&&!a.altKey&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&CSS.hasClass...

Это в сценарии, который вызывается из заголовка корневого документа. Я пробовал следующее, чтобы отключить их:

//contents script:
$().ready( function() {
  document.documentElement.onkeydown = '';
});

и даже

$().ready( function() {
  document.documentElement.onkeydown = function(e){};
});

Я предполагаю далее, что причина, по которой ни одна из этих попыток не работает, заключается в том, что, хотя скрипты содержимого расширения Chrome совместно используют DOM с любой веб-страницей, на которой они работают, возможно, они не разделяют среды кодирования? Любое понимание будет оценено!

3 ответа

Решение

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

Согласно документу Chrome о скриптах содержимого:

However, content scripts have some limitations. They cannot:
*  Use chrome.* APIs (except for parts of chrome.extension)
*  Use variables or functions defined by their extension's pages
*  Use variables or functions defined by web pages or by other content scripts

Прежде всего, я бы порекомендовал вам рассмотреть различные сочетания клавиш. Переопределение функциональности существующих горячих клавиш для вашего собственного расширения может вызвать неприятные ощущения у пользователя, ожидающего сочетание клавиш Facebook. Представьте, что расширение скопировало бы ярлыки ctrl-c и ctrl-p, которые являются частью настольной ОС для копирования и вставки - я думаю, что у вас будут некоторые расстроенные пользователи, которые, вероятно, удалят то, что изменило поведение, которое они изучали ранее.

Однако, если вы настойчивы, то вот обходной путь для загрузки JavaScript, который будет выполняться в контексте содержащей страницы:

Редактировать: Обновлен для каждого комментария, чтобы ссылаться на файл JS в плагине вместо одного, размещенного в Интернете.

Во-первых, вам нужно создать файл JavaScript в вашем плагине Chrome: override-fb-hotkeys.js,

Во-первых, вам нужно разместить где-то в Интернете файл JavaScript, содержащий скрипт, который вы хотите выполнить на странице, скажем, вы разместите его по адресу: http://example.com/override-fb-hotkeys.js ,

Затем из вашего скрипта содержимого вы можете вставить тег DOM в DOM, который ссылается на ваш файл JavaScript, примерно так:

    var script = document.createElement('script');
    script.setAttribute("type", "text/javascript");
    script.setAttribute("async", true);
    script.setAttribute("src", chrome.extension.getURL("override-fb-hotkeys.js")); //Assuming your host supports both http and https
    var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
    head.insertBefore(script, head.firstChild)

Затем JavaScript будет извлечен и выполнен в контексте содержащейся страницы, а не в изолированном программном коде из плагина Chrome.

Скрипты содержимого Chrome выполняются в изолированной среде [источник]. Там нет прямого способа общаться с глобальным (window) объект.

Другая распространенная ошибка заключается в том, что разработчик забывает, как / когда вводится скрипт.

  • По умолчанию скрипт внедряется в точке с именем " document_idle ". На данный момент документ не занят (DOMContentLoaded выстрелил, window.onload может или не может быть уволен).
  • В результате функции в скрипте могут быть перезаписаны сразу после объявления.

Чтобы добавить небольшой скрипт, я рекомендую добавить код непосредственно в Content Script:

var actualCode = '/* Code here (see below for inspiration) */';

var script = document.createElement('script');
script.appendChild(document.createTextNode(actualCode));
(document.head || document.documentElement).appendChild(script);
script.parentNode.removeChild(script);

Если вы хотите убедиться, что метод не будет перезаписан, вы можете использовать Object.defineProperty, чтобы определить неизменное свойство:

Object.defineProperty(document.documentElement, 'onkeydown', {
    value: function() {},
    writable: false,     /* Cannot be overwritten, default false */
    configurable: false, /* Cannot be deleted, or modified */
    enumerable: true     /* Does not really matter. If true, it's visible in
                             a for-loop. If false, it's not*/
});

Ранее упомянутый метод поддерживается в Firefox 4+ и, по крайней мере, в Chrome 5+. Если вы хотите также поддерживать Firefox 2+ и Chrome 1+, вы можете играть с __defineSetter__, предотвращать onkeydown из определения:

document.documentElement.__defineSetter__('onkeydown', function(){});

Вот как вы можете сделать это с помощью jQuery

Удалите все ярлыки для любой веб-страницы:

$('[accessKey]').attr('accessKey','')
Другие вопросы по тегам