我正在尝试创建一个投放灯箱的广告,但广告本身将被放置在iframe内和/或注入网站(不是同一个域)。有些网站会将其放在iframe中,有些网站会将其放在网站上。我无法控制广告所在的网站。
我知道我可以使用postMessage()
从iframe中发送数据,并使用接收到的数据在父窗口上执行命令,但我不能在父窗口上放置任何代码。是否有适用于两种场景的通用解决方案?我想将一些内容推送到父窗口。
这段代码完全符合我的要求,但我不知道它是如何做到的:
<script src="http://bs.serving-sys.com/BurstingPipe/adServer.bs?cn=rsb&c=28&pli=17085731&PluID=0&w=1&h=1&ord=[timestamp]&ucm=true&ncu=$$%c$$"></script>
<noscript>
<a href="%chttp%3A//bs.serving-sys.com/BurstingPipe/adServer.bs%3Fcn%3Dbrd%26FlightID%3D17085731%26Page%3D%26PluID%3D0%26Pos%3D67849382" target="_blank"><img src="%%VIEW_URL_ESC%%.http://bs.serving-sys.com/BurstingPipe/adServer.bs?cn=bsr&FlightID=17085731&Page=&PluID=0&Pos=67849382" border=0 width=1 height=1></a>
</noscript>
答案 0 :(得分:2)
如果代码在框架/ iframe中,并且您无法访问父框架/窗口,并且父框架/窗口没有通过postMessage()
设置API来加载弹出窗口/灯箱,那么答案就是答案不是。
唯一可以执行此操作的方法是使用友好的iFrame(与父框架/窗口相同的域)或执行解决方法以允许访问父框架/窗口。请注意,即使这样做并且您访问并更改了父级,如果他们不期望您要添加的内容或者您有意或无意地更改其网站或样式表,您可能会激怒该网站的发布者或所有者。以任何方式或注入可能是恶意的脚本。如果您反复这样做,您可能会被您发送广告的任何网络所禁止。
如果使用SafeFrame,您将无法执行此操作。 SafeFrame旨在防止广告客户更改顶级窗口/框架,如果广告是可展开的广告类型,则会提供API来展开广告,但SafeFrame API中没有广告素材。
如果您想测试是否可以访问父/顶部框架/窗口,可以尝试:
对于顶部框架/窗口:
try { window.top.location.href } catch(e) {
// Exception was thrown meaning you do not have access to the top window/frame!
}
对于父(可能不是最顶层)框架/窗口:
try { window.parent.location.href } catch(e) {
// Exception was thrown meaning you do not have access to the parent window/frame!
}