Расширение Chrome: Связь iframe <-> Сценарий содержимого - PullRequest
1 голос
/ 24 августа 2011

Ну, часто обсуждаемая вещь.Но я не могу заставить это работать.Что нужно сделать:

  • Контент или фоновый сценарий должен взаимодействовать с iframe и наоборот.
  • iframe у меня под рукой, поэтому есть все возможное.

Я много пробовал.Это не работает вообще.Например: если я разверну скрипт контента на каждой странице с allFrames = true via (manifest).Хорошо, имеет смысл.Iframe создается позже, поэтому триггер не будет вызван.Итак, давайте сделаем это: создадим iframe и затем отправим запрос executeScript:

 chrome.tabs.executeScript(tabinst.tab_id, { allFrames: true, file:'frame.js'}, function() {
      console.log("done");
 });

Но это тоже не сработает.У кого-нибудь есть решение для связи с iframe XDM и расширением chrome?

PS: Как бы хорошо, если расширение chrome позволило бы postMessage для iframe

EDIT1:

Код не вставляется в iframe.Сценарий:

В файле "file.js" есть простая функция foo.Теперь я применяю его с указанным выше оператором через 2 секунды после создания и показа iframeЭта функция foo недоступна в iframe ... но есть в скрипте содержимого.Ошибка ReferenceError вызывается при попытке выполнить foo в iframe (по щелчку).

Так что это не время.И не имеет значения, применяю ли я Сценарии с помощью manifest и all_frames true.Если это сработает, будет доступен контент_скрипт.Но это не так.

EDIT2: @ serg

Да, спасибо, это работает!Я только что прошел через это.Моя проблема заключалась в том, что я предполагал, что когда вызывается обратный вызов chrome.tabs.executeScript, запрошенный сценарий завершается, и завершается манипуляция с DOM.Но на самом деле это не так.Требуется некоторое время, чтобы скрипт в iframe и содержащий слушатель был готов.

Поэтому мне пришлось отправить chrome.extension.sendRequest из этого скрипта в iframe, а затем запустить некоторый код из фонового слушателяманипулировать iframe.Спасибо за вашу помощь.

PS: Это также возможно сделать без "all_frames": true.Это займет некоторое время, пока динамический iframe не будет готов.С таймаутом это работает.В большинстве случаев это бесполезно, но, возможно, у кого-то сначала будет другое взаимодействие с пользователем.

PPS: Я до сих пор не понимаю, почему это возможно, и невозможно отправить события postMessage.Но, может быть, когда-нибудь это сработает.

1 Ответ

2 голосов
/ 24 августа 2011

Я только что протестировал, и скрипт содержимого вставляется в динамически создаваемые iframes (я использовал manifest).Я думаю, проблема в том, что вы пытаетесь получить доступ к функции скрипта контента в iframe, что недопустимо.

Внутри iframe вы не можете просто сделать:

<a onclick="contentScriptFunction()"></a>

Вам необходимо добавить прослушиватель событий из скрипта содержимого:

$("a").click(contentScriptFunction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...