【问题标题】:Chrome Extension: Communication iframe <-> Content ScriptChrome 扩展:通信 iframe <-> 内容脚本
【发布时间】: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


【解决方案1】:

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

在你的 iframe 中你不能只做:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2011-04-25
    • 2012-07-04
    • 2013-05-20
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多