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

во-первых, я бы рекомендовал вам рассмотреть различные сочетания клавиш. Переопределение функциональных возможностей существующих клавиш быстрого доступа для собственного расширения может предоставить пользователю jarring опыт для тех,кто ожидает сочетания клавиш 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','')