【发布时间】:2011-11-02 10:46:15
【问题描述】:
嗯,经常讨论的事情。但我无法让它工作。必须做什么:
- 内容或背景脚本必须与 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 true 应用脚本也没关系。如果这样可行,则 content_script 将可用。但不是。
EDIT2: @serg
是的,谢谢,这行得通!我刚刚度过难关。我的问题是,我假设当调用 chrome.tabs.executeScript 的回调时,请求的脚本结束并且包含 DOM 操作完成。但事实并非如此。 iframe 中的脚本和包含的侦听器准备就绪需要一些时间。
所以我必须从 iframe 中的该脚本发送一个 chrome.extension.sendRequest,然后从后台侦听器中启动一些代码来操作 iframe。感谢您的帮助。
PS:没有“all_frames”也可以做到这一点:true。动态 iframe 准备好只需要一些时间。超时它可以工作。在大多数情况下,这没什么用,但可能有人先进行了另一个用户交互。
PPS:我仍然不明白为什么会这样,也无法发送 postMessage 事件。但也许在某些时候这会奏效。
【问题讨论】:
-
您在将内容脚本注入动态创建的 iframe 时遇到问题吗?或者你可以注入它,但以后不能和它通信(发送请求)?
-
@serg 对,这不是很清楚。通过在 iframe 中注入脚本,我遇到了麻烦。见 EDIT1。
标签: iframe google-chrome-extension cross-domain