Расширение Chrome: вставка тега javascript и вызов функции - PullRequest
3 голосов
/ 09 мая 2011

У меня есть расширение Chrome, которое использует сценарий содержимого для динамической вставки тега сценария, ссылающегося на внешний файл javascript .Код, который я использую:

var html_doc = document.getElementsByTagName('head')[0]; 
var _js = document.createElement('script');  
_js.setAttribute('type', 'text/javascript'); 
_js.setAttribute('id', 'chr_js'); 
_js.setAttribute('src', 'http://unixpapa.com/js/dyna1.js'); 
if(!document.getElementById('chr_js')) 
html_doc.appendChild(_js);

Внешний Javascript содержит следующий код:

function lfunc(){
  alert('RUNNING loaded function');
}
alert('LAST LINE of script');

Когда я загружаю страницу во вкладке, " LAST LINE сценария"появляется сообщение, показывающее, что тег сценария правильно вставлен в DOM.

У моего расширения также есть кнопка (т. Е. Browser_action).Теперь я хотел бы, чтобы эта кнопка вызывала lfunc () , определенную выше, при каждом нажатии.К сожалению, мой код просто не работает .

Я использую следующий код на странице background.html для обработки события onClick моей кнопки:

<script>
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript(null, 
    {code: "try {lfunc()} catch (e) {alert(e);}"});
  }); // it should call lfunc()
</script>

Разрешения в файле manifest.json :

"permissions": [
"tabs", "http://*/*", "https://*/*"  ]

Вместо того, чтобы получить сообщение " RUNNING загруженная функция ", которое я получаюсообщение об ошибке « ReferenceError: lfunc не определено ».

Что я делаю не так?

Ответы [ 3 ]

9 голосов
/ 12 мая 2011

Вы можете выполнить внешний файл 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 расширения в расширение.Это позволит работать в автономном режиме и никогда не требует (другого) подключения к стороннему серверу.

1 голос
/ 31 мая 2011

Мне нужно было вызвать функцию, которая была внутри одного из скриптов страниц ...

location = 'javascript:callToTheFunction(param,param,..)' did it.  

Я говорю с контентом

1 голос
/ 09 мая 2011

Замените alert('It doesn't work'); на alert(e);

Это должно дать вам лучшее представление об ошибке.Пожалуйста, опубликуйте ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...