我在“友好的iframe”环境中遇到了具有挑战性的iFrame检测问题。我需要从window.top
中识别window.top.document
中的哪个外域iframe元素在其自身内部加载另一个与window.top
具有相同域,协议和端口的iframe。
所以这是一个核心问题:在页面A上,如何在JavaScript中确定iFrame B包含iFrame C?同样,Page A和iFrame C属于同一个域,协议和端口可以互相沟通。 iFrame B位于不同的域中。我想在页面A上找到与iFrame C相关联的DOMElement。
可能已经尝试过但没有奏效的事情:
document.referrer
匹配。页面A将页面A上所有iframe的src
属性与iFrame C中的document.referrer
属性相匹配。不幸的是,如果页面A上的多个iframe在iframe B上加载内容相同的src,则此功能不起作用。如果iframe B的src
属性为about:blank
或javascript:something
,它也无效。window.location.hash
属性进行src
通信。页面A无法获得iFrame B的window.location.hash
,因此没有运气。其他信息:
这是一个名为“Friendly iFrames”的配置。友好的iFrames(FIF)在广告业中很常见。以下是它们的工作原理:
发布商网站上的一个页面,例如Page A foo.com,从some-random-ad-server.com注入iframe B.然后在some-random-ad-server.com上的iframe B内部,从foo.com加载另一个iframe C.所以:
答案 0 :(得分:0)
我意识到这已经过时了,但我对客户端解决方案感到好奇并且遇到了这个帖子。我正在使用服务器端处理这个,为什么不使用服务器端作为最后的手段?授予引用者在服务器端是粗略的,但是在处理iframed页面时,引用者非常可靠,可以与本地应用程序的主机和引用应用程序进行比较。
以下是我在ASP.NET / C#中的表现(同样的事情可以用PHP等完成)
// set referrer
if (Request.UrlReferrer != null && Request.Url.Host != Request.UrlReferrer.Host)
{
Session["Referrer"] = Request.UrlReferrer.OriginalString;
}