我正在编写一个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
答案 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