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

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

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

и даже

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

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

Ответ 1

Вы интуитивно поняли, JavaScript, который запускается из контента script как часть расширения 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 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 где-то в Интернете, который содержит script, который вы хотите выполнить на странице, скажем, вы размещаете его по адресу: http://mysite.com/override-fb-hotkeys.js.

Затем из вашего содержимого script вы можете вставить тег 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.

Ответ 2

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

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

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

Чтобы ввести небольшой script, я рекомендую добавить код непосредственно в 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 visible in
                             a for-loop. If false, it not*/
});

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

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

Ответ 3

Вот как вы можете это сделать, используя jQuery

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

$('[accessKey]').attr('accessKey','')