广告提供商希望我们向我们的网站添加一些Javascript,以允许他们调整投放广告的iframe的大小。我一直在浏览代码,其中一部分就是这个循环:
var topIframes = top.document.getElementsByTagName('IFRAME');
for (var i = 0; i < topIframes.length; i++) {
if (topIframes[i].contentWindow === self) {
// found iframe that served the ad
topIframes[i].style.height = sz + 'px';
}
}
我可以看到它正在抓取文档中的所有iframe并调整其中一个或多个的高度。但我无法弄清楚情况在做什么。
我知道contentWindow是iframe中的窗口,看着What's the difference between self and window?我看到“self”是对窗口对象的引用。但是哪个窗口对象?父窗口或iframe内的窗口? iframe里面还有一个窗口吗?为什么检查iframe中的窗口是否是iframe中的窗口?
////////////////////////////////////////////
修改
在Snuffleapagus的要求下,这是长版:
<script type="text/javascript">
// iframe shrink function that needs to be on the hosting page
rp_resize = function (sz) {
try {
var topIframes = top.document.getElementsByTagName('IFRAME');
for (var i = 0; i < topIframes.length; i++) {
if (topIframes[i].contentWindow === self) {
// found iframe that served the ad
topIframes[i].style.height = sz + 'px';
}
}
} catch (e) {
}
}
</script>
<script>
// this is the code that goes in the passback to initiate the function
try {
if (typeof(rp_mpu) === 'function') {
rp_resize(250);
}
} catch (e) {
}
</script>
<script language="JavaScript" type="text/javascript">
rp_account = '<account-id>';
rp_site = '<site-id>';
rp_zonesize = '<zone-id>-<size-id>';
rp_adtype = 'js';
rp_smartfile = 'http://<url>/..../revv_smart_file.html'; // this should be the URL path to the friendly iframe that needs resizing
</script>
<script type="text/javascript" src="http://ads.<url>.com/ad/<account-id>.js"></script>
////////////////////////////////////////////
修改
这是广告提供商在回答我关于这个问题的问题时可能提供的线索。不知道它有多大用处,因为他不是开发人员。
“您正在查看的代码行正在尝试确定它是否是启动该函数的iFrame,因此可以相应地调整其大小。”
答案 0 :(得分:1)
根据我的理解使用Javascript以及它如何访问iFrame,提供商假设您在页面上有多个iFrame。此外,它假设他们正在寻找的iFrame没有容易引用的ID。
基于此,在加载广告内容的帧之后,在某个时刻它将调用rp_resize(250);.但是,函数rp_resize不知道调用它的页面上的哪个iFrame。该脚本循环遍历页面上的所有iFrame,直到找到调用该函数的那个iFrame。这就是它知道调用哪个帧的方式。
希望这有意义和/或回答你的问题。
答案 1 :(得分:0)
我认为,self
指的是父窗口。要进行检查,请在浏览器控制台中键入以下内容并查看结果:
self == window
答案 2 :(得分:0)
.contentWindow
尚未完全加载, null
将返回iframe
。看起来代码循环遍历iframes
,检查它们是否已加载,如果是,则调整它们的大小。
编辑2:Why check that the window inside an iframe is the window inside an iframe?
如果尚未加载,则为空;如果它被加载,它就是一个窗口。