访问 IFrame 的父 URL [重复]

Posted

技术标签:

【中文标题】访问 IFrame 的父 URL [重复]【英文标题】:Access IFrame's parent URL [duplicate] 【发布时间】:2011-11-26 08:35:30 【问题描述】:

可能重复:access parent url from iframe

我一直在环顾四周,但找不到一个固定的答案或解决方案。 我有 2 个网站,www2.domain.netwww3.domain.net 这两个网站都有一个 iFrame 链接到 www.domain.co.uk/iframe.html

我想要做的是检查父 URL,即 - 是访问 www2.domain.netwww3.domain.net 的用户,因此我可以向访问 www3.domain.net 的人显示特定信息。

这可能吗?

谢谢, 安德鲁

【问题讨论】:

【参考方案1】:

由于Same Origin Policy,在这种情况下(如已发布)是不可能的。但是,您似乎控制了所有这些域。如果是这样,您可以使用查询字符串在 iFrame 标记的 src 属性中传递父域并在 iFrame 页面中访问它。请参阅@Andy 的实施答案。

【讨论】:

同域有可能 @Mohsen,OP 已经明确提到了所有域。主机页面和 iframe 的域不同,因此 iframe 无法读取父级的位置。 @Mohsen,你想用那个小提琴展示什么?在任何情况下,由于 jsFiddle 本身将结果呈现在另一个具有 fiddle.jshell.net 域(不同于父 jsfiddle.net)的 iFrame 中,因此您编写的示例会产生“访问属性 'href' 的权限被拒绝”(正如预期的那样)。【参考方案2】:

这是可能的,但不是很简单,并且需要您控制所涉及的所有三个页面。

如果您确实控制了所有三个站点,则会出现跨窗口消息传递,由 window.postMessage() 提供。但是,它是 DOM 的(相对)新增功能,在 IE 7、IE 6、Safari 4、Firefox 2 和 Opera 9 等旧版浏览器中不受支持。

// Parent:
iframeWin.postMessage("Hello, from "+window.location.host);


// Iframe: 
window.onmessage = function (evt)  alert(evt.origin); 

另一种选择是通过 URL 传递域,然后在另一端解析:

<iframe src="www.domain.co.uk/iframe.html?www2.domain.net" />

以及所需的 javascript(从 iframe 内的页面调用):

alert(window.location.search);
//-> "?www2.domain.net"

【讨论】:

很多浏览器不支持这个 caniuse.com/#search=cross-document 消息传递 @Mohsen:我的大脑从答案中漏掉了两个字,现在已修复。当您说“这个”时,似乎您指的是整个答案。我回答的最后一部分可以在任何浏览器中实现。【参考方案3】:

事实并非如此。 iframe 被视为框架,因此跨域策略适用于它们。由于 iframe 域 (www.domain.co.uk/iframe.html) 与父域 (www3.domain.net) 不同,因此它无法访问父域。但是,我相信您仍然可以通过 DOM 或 window.frames(包括 iframe 在内的所有框架的数组)从父域访问 iframe。

【讨论】:

以上是关于访问 IFrame 的父 URL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

获得从 iframe 到我无法控制的父窗口 dom 的跨域访问?

如何使用模板语法访问 vuejs 中的父数据值

iFrame父节点

如何使用 Javascript 从 iframe 实现跨域 URL 访问?

在父级从 iframe 访问变量的值

根据是不是通过 iframe 查看网站来阻止访问网站 [重复]