Chrome扩展:通信iframe<-&燃气轮机;内容脚本

Chrome扩展:通信iframe<-&燃气轮机;内容脚本,iframe,google-chrome-extension,cross-domain,Iframe,Google Chrome Extension,Cross Domain,嗯,一件经常被讨论的事情。但我不能让它工作。必须做的事情: 内容或背景脚本必须与iframe et通信,反之亦然 iframe在我的手下,所以有一切可能 我试了很多。这根本不起作用。例如:如果我通过(manifest)在每个页面上部署allFrames=true的内容脚本。好的,有道理。iframe稍后创建,因此不会调用触发器。让我们这样做:创建iframe,然后发送executeScript请求: chrome.tabs.executeScript(tabinst.tab_id, { a

嗯,一件经常被讨论的事情。但我不能让它工作。必须做的事情:

  • 内容或背景脚本必须与iframe et通信,反之亦然
  • iframe在我的手下,所以有一切可能
我试了很多。这根本不起作用。例如:如果我通过(manifest)在每个页面上部署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中不可用,但在内容脚本中可用。ReferenceError是通过尝试在iframe中执行foo(通过单击)引发的

所以,这不是时间问题。如果我通过manifest应用脚本,并且所有的框架都为true,这并不重要。如果这能奏效,那么content_脚本就可以使用了。但事实并非如此

EDIT2: @塞格

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

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

PS:也可以在没有“所有帧”的情况下进行:正确。动态iframe准备就绪需要一些时间。有一个超时,它就工作了。在大多数情况下,这是没有用的,但是可能有人首先有另一个用户交互


PPS:我仍然不明白为什么会这样,为什么不可能发送postMessage事件。但也许这会奏效。

我刚刚测试过,内容脚本正在被注入动态创建的iFrame中(我使用了manifest)。我认为问题在于您试图在iframe中访问内容脚本的函数,这是不允许的

在iframe中,您不能只执行以下操作:

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

将内容脚本注入到动态创建的iframe中是否有问题?或者您可以注入它,但以后无法与它通信(发送请求)?@serg对,这还不太清楚。我在iframe中注入脚本时遇到了麻烦。见第1版。
$("a").click(contentScriptFunction);