Как отключить горячие клавиши 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){};
});

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

3 6

3 ответа:

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

В соответствии с Chrome doc на скриптах контента :

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, который будет выполняться в контексте содержащей страницы:

Edit: Обновлено по комментарию к ссылке JS-файл в плагине вместо одного, размещенного в интернете

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

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

Затем из вашего скрипта содержимого вы можете вставить тег script в 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 может выстрелить, а может и не выстрелить).
  • в результате, функции в скрипте могут быть перезаписаны сразу после объявления.

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

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','')