Вы можете выполнить внешний файл JS (вставив его в DOM (document
в расширении)).Внешний файл JS также имеет доступ к локальному DOM.
Невозможна связь между этими двумя:
- Невозможно получить доступ к добавленному пользователем Javascript (не нативному)расширением:
JS расширения не имеет доступа к объекту jQuery
страницы, но имеет доступ к своему document.body
. - добавленному пользователем Javascript (JS илиВаш добавленный внешний JS) не имеет доступа к расширению:
Со страницы вы не можете получить доступ к API Chrome, таким как закладки, вкладки, действия браузера и т. д.
Это сделаноочень намеренно по соображениям безопасности.
То, о чем я говорил (sendRequest
и onRequest
), - это связь между «сценарием содержимого» и страницами сценария / фона расширения.В вашем случае не имеет значения =) Извините.
ответы
> Я не могу вызвать определенные функции во внешнем файле JS из расширения из-за отсутствия связиВозможности между двумя
Это верно.
> Все, что я могу сделать, - это заставить мое расширение внедрить внешний файл JS в DOM.Это выполнит все, что должно быть выполнено во внешнем файле JS
Это верно.Ext JS может содержать немедленные действия, таймеры и т. Д., Как это было бы с обычным загруженным JS (на самой веб-странице).
> Детализация запуска кода из расширения на внешнем уровне JS, а не на JSфункциональный уровень
Что вы подразумеваете под JS function level
?Расширение JS?
PS
chrome.tabs.executeScript
не так круто, как вы думаете.По сути, он выполняет скрипт в контексте страницы (например, content_scripts
).Однако он имеет те же ограничения, что и content_scripts
: он может достигать DOM и нативной функциональности JS, бот не добавляется пользователем JS.Пример:
// Inside a `background_page`:
chrome.tabs.executeScript(null, {
"code": "document.body.removeChild(document.body.firstChild);"
});
Это работает, потому что требуется только доступ к DOM (всегда существующему) страницы.Следующее не будет работать (при условии, что jQuery был включен в саму веб-страницу):
// Still inside a `background_page`:
chrome.tabs.executeScript(null, {
"code": "jQuery('input').remove();"
});
Это не будет работать, потому что jQuery
- это сторонний, не родной, добавленный пользователем объект JS, которыйнедоступен расширению (как background_page
, так и content_scripts
).
Я не совсем понимаю причину этого последнего ограничения, но все дело в песочнице и безопасности в Chrome =) Я думаю, это хорошая вещь...
BTW
Я думаю, что решение вашей проблемы довольно простое ... Вы можете сделать так, чтобы browser_action
вставлял внешний JS в DOM страницы.Этого достаточно, верно?Внешний JS содержит логику И фактический вызов функции.Лучшее решение для всех, потому что внешний JS загружается только тогда, когда нажата / сработала кнопка browser_action
.Один очень небольшой недостаток: очень короткая задержка (= загрузка внешнего JS после нажатия browser_action
).
Могу еще раз предложить: поместите все свои JS расширения в расширение.Это позволит работать в автономном режиме и никогда не требует (другого) подключения к стороннему серверу.