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