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