我正在尝试创建一个投放灯箱的广告,但该广告本身将放置在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>

最佳答案

如果代码在框架/ iframe中,并且您无权访问父框架/窗口,并且父框架/窗口没有通过postMessage()设置API来加载弹出窗口/灯箱,那么答案是否定的。

唯一可以执行此操作的时间是使用友好的iFrame(与父框架/窗口相同的域)或执行变通办法以允许访问父框架/窗口。请注意,即使这样做并且您访问并更改了父级,也可能激怒框架所在的发布者或网站所有者,如果他们不希望您尝试添加的内容,或者您​​有意或无意地更改了他们的网站或样式表以任何方式注入恶意脚本。如果您重复执行此操作,那么您通过其发送广告的任何网络也可能会禁止该广告。

如果使用SafeFrame,则将无法执行此操作。 SafeFrame旨在防止广告客户更改顶级窗口/框架,如果广告是可扩展广告类型,但SafeFrame API中没有弹出窗口,它会提供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!
}

10-05 21:01
查看更多