Chrome扩展程序:通讯iframe< - >内容脚本

时间:2011-08-24 02:41:08

标签: iframe google-chrome-extension cross-domain

嗯,经常讨论的事情。但我无法让它发挥作用。必须做些什么:

  • 内容或后台脚本必须与iframe通信,反之亦然。
  • iframe在我手中,所以有一切可能。

我尝试了很多。它根本不起作用。例如:如果我通过(清单)在allFrames = true的每个页面上部署内容脚本。好的,有道理。 iframe稍后创建,因此不会调用触发器。所以我们这样做:创建iframe,然后发送一个executeScript请求:

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

但这也不起作用。有没有人可以与XDM iframe和Chrome扩展程序进行通信?

PS:如果chrome扩展允许在iframe上使用postMessage

,那会有多好

EDIT1:

代码不会在iframe中注入。情形:

文件“file.js”中有一个简单的foo函数。我现在在iframe创建并显示2秒后将其应用于上述语句。此函数foo在iframe中不可用...但在内容脚本中。尝试在iframe中执行foo(通过单击)抛出ReferenceError。

所以,这不是时间问题。如果我通过manifest和all_frames应用Scripts并不重要。如果这样可行,则content_script可用。但事实并非如此。

EDIT2: @serg

是的,谢谢,这有效!我刚刚完成了它。我的问题是,我假设当调用chrome.tabs.executeScript的回调时,请求的脚本结束并且包含DOM操作完成。但事实并非如此。在iframe和包含侦听器中的脚本准备就绪需要一些时间。

所以我必须从iframe中的该脚本发送chrome.extension.sendRequest,然后从后台侦听器中启动一些代码来操纵iframe。谢谢你的帮助。

PS:没有“all_frames”也可以这样做:是的。动态iframe准备就绪需要一些时间。超时它有效。在大多数情况下,这没有用,但可能有人先进行另一次用户交互。

PPS:我仍然无法理解为什么这样可能,并且无法发送postMessage事件。但也许有些人会这样做。

1 个答案:

答案 0 :(得分:2)

我刚测试过,内容脚本被注入到动态创建的iframe中(我使用了清单)。我认为问题是你试图在iframe中访问内容脚本的功能,这是不允许的。

在你的iframe中你不能只做:

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

您需要在内容脚本中添加事件侦听器:

$("a").click(contentScriptFunction);