从多级跨域iframe确定顶级窗口的URL

时间:2015-01-01 05:46:52

标签: javascript iframe cross-domain

我正在编写一个JavaScript像素,将在发布商页面上与AD广告素材一起投放。此广告将包含在发布商网站上的跨域iframe(有时是多个级别)中。所以发布商页面看起来像这样

主持人(发布商)网站

<html>
    <iframe src="http://domain1.com" name="first_level_iframe">
        <iframe src="http://domain2.com" name="second_level_iframe">
            <!--The script I want to write will be hosted here-->
        </iframe>
    </iframe>
</html>

如果广告客户想要了解他/她的AD所服务的所有网页,那么我们需要知道主页网址。

如上所述here我们可以像这样使用document.referrer获取父页面网址

var url = (window.location != window.parent.location) ? document.referrer: document.location;

但它仅适用于只有一级的域。我们无法达到最高级别,因为我们对“domain1.com”iframe没有任何控制权。 这是人们试图长期解决的一个问题,而且已经有许多问题已经在SO上提出了完全相同的问题。 但是由于这个article,我再次问它。它声称他们拥有可以检测顶级窗口URL的专利解决方案。以下是博客的摘录

  

救生员是AdSafe开发的一项技术:关键   解决方案是能够读取顶部框架的地址   托管广告(*)。我们正在检测色情片,因为广告是   应该出现在一个“干净的出版商”网站上   在色情网站的框架内。以HGTV为例,   但不是这种“干净的出版商”的真实例子。

那么,有没有办法检测顶级窗口网址?

类似的问题: Top window's URL form inside of multiple nested cross-domain iFrames

2 个答案:

答案 0 :(得分:1)

如果您在同一个域中,则可以使用

访问顶部框架
window.top.location.href

这是一个简单的答案。

如果您的嵌套iframe位于与您的顶级域不同的域中,那么您将遇到相同的源策略问题,即出于安全原因,托管在不同域上的帧无法相互通信。

如果您控制嵌套框架的创建,一种解决方法是传递指向嵌套框架的查询字符串参数。

另一种方法是使用HTML5 postMesssage在帧之间进行通信,但同样需要您控制两个域。

希望有所帮助。

答案 1 :(得分:1)

我有一个解决方案,你可以在Chrome和Opera中获取域名(在多个嵌套的跨域iframe中),但不幸的是,在其他浏览器中无法实现。

您可以使用&#39; window.location.ancestorOrigins&#39;属性。

此代码段将跨浏览器工作,以便为您获取最接近的页面网址:https://gist.github.com/ocundale/281f98a36a05c183ff3f.js