【发布时间】:2014-11-18 13:26:58
【问题描述】:
在我的 Chrome 扩展程序中,我将 内容脚本 注入到页面内的所有 IFRAMEs 中。这是manifest.json 文件的一部分:
"content_scripts": [
{
"run_at": "document_end",
"all_frames" : true,
"match_about_blank": true,
"matches": ["http://*/*", "https://*/*"],
"js": ["content.js"]
}
],
因此,具有多个IFRAMEs 的单个网页最终会运行我注入的content.js 的那么多副本。
content.js 内部的逻辑从注入的每个IFRAME 或从主页/首页收集数据,并将其发送回后台脚本(使用chrome.runtime.sendMessage。) 后台脚本反过来需要将数据存储在全局变量中,稍后在扩展本身中使用。
我面临的问题是应用程序需要区分从多个IFRAMEs接收的“数据”,因为我的数据收集方法可以在用户与页面交互时重复调用,因此我不能简单地“将后台脚本接收到的数据转储到一个数组中。相反,我需要使用dictionary 类型的数据存储。
我可以通过运行以下命令来判断数据是来自IFRAME 还是来自首页:
//From the `content.js`
var isIframe = window != window.top;
我的想法是,如果我收集每个 IFRAME 的页面 URL,那么我应该能够将其用作唯一键来将数据存储在我的字典类型全局变量中:
//Again from content.js
var strUniqueIFrameURL = document.URL;
好吧,那是行不通的,因为两个或多个 IFRAMEs 可以有相同的 URL。
所以我最初的问题是——如何区分页面上的IFRAMEs? Chrome 是否为他们分配了一些唯一 ID 或某些东西?
【问题讨论】:
-
重新表述您的问题。假设有一个页面上有 3 个
<iframe>s,内容脚本都被注入其中,并且您想知道“这是标签 X 上第二个<iframe>中的内容脚本”。 iframe 是跨域的,使其更有趣。我理解正确吗?如果是,这是一个有趣的问题。 -
@Xan:是的,你是对的。除了
iframes可以是同源和跨源。 (我不是我的内容脚本注入的页面的作者,所以我假设这两种情况。) -
没有跨域问题,
window.frameElement和window.parent.document.querySelectorAll("iframe")很容易解决。但是你不能使用跨域 iframe 访问那些。 -
等等!是可以解决的!由于内容脚本可以访问
window.parent,不像框架自己的代码。 -
@Xan:嗯。谢谢。我得把它关到早上。现在为时已晚……想不通。会告诉你它是否有效。
标签: javascript google-chrome iframe google-chrome-extension