Как отключить горячие клавиши facebook с расширением Chrome? - PullRequest
6 голосов
/ 24 января 2012

Я создал расширение 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 ]

9 голосов
/ 25 января 2012

Сценарии Chrome Content выполняются в изолированной среде [источник] . Не существует прямого способа связи с глобальным (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(){});
5 голосов
/ 24 января 2012

Ваша интуиция верна, 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.

1 голос
/ 16 июня 2013

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

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

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