【问题标题】:What's this Javascript condition checking?这是什么 Javascript 条件检查?
【发布时间】:2013-11-05 16:54:31
【问题描述】:

广告提供商希望我们向我们的网站添加一些 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 并调整其中一个或多个 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,以便可以相应地调整其大小。”

【问题讨论】:

  • 我不是 100%,这就是为什么这是一条评论,但在我看来,它正在检查 iframe 的窗口是否与当前窗口相同,但为什么这是真的什么让我感到困惑。也许其余的代码有一些提示?
  • 您还有代码要显示吗? iframe 的.contentWindow 指的是 iframe 本身的窗口对象,所以我不确定为什么它会等于普通的窗口对象。另一个麻烦的部分是sz 变量来自哪里?
  • 不能通过对窗口的引用来更改 iframe 的样式,需要对 iframe 本身的引用,并且该引用保存在父级中。此代码正在搜索,从框架集的根(顶部属性)的角度来看,找到定义当前窗口(当前是运行 javascript 代码的上下文,因此 self)的 iframe 引用,并且一旦引用找到了,样式就变了。见this
  • @MCND:但如果这段代码在 OP 的站点中运行(不在 IFRAME 中),那么 top 实际上与 self 是一样的吗?如果代码在 IFRAME 中运行会更有意义,但不是
  • @musefan:哪里说没有iframe?你怎么知道代码在哪里运行?而且我不知道广告提供商(在 OP 问题中)是否没有生成自己的 iframe。不过没关系,如果没有任何类型的frame/iframe,是window.top = window.self

标签: javascript html iframe


【解决方案1】:

根据我对使用 Javascript 以及它如何访问 iFrame 的了解,提供商假设您在页面上有多个 iFrame。此外,它假定他们正在寻找的 iFrame 没有可轻松引用的 ID。

基于此,在加载了广告内容的框架后,它会在某个时候调用 rp_resize(250);。但是,函数 rp_resize 不知道它是从页面上的哪个 iFrame 调用的。该脚本遍历页面上的所有 iFrame,直到找到调用该函数的 iFrame。这就是它知道调用哪个帧的方式。

希望这有意义和/或回答您的问题。

【讨论】:

  • 这没有意义!您建议该脚本是从广告提供商 iframe 中运行的,但 OP 表示他们已获得此脚本以包含在他们自己的页面(托管 iframe 的页面)中。在广告 iframe 中运行非常有意义,但在这种情况下它不会
  • @musefan 正确。该脚本正在从广告提供商的 iFrame 中启动。但是,iFrame 不具备更改其自身大小的能力。因此,脚本需要在页面级别启动。然后该脚本会找到合适的 iFrame,并更改其显示大小。
【解决方案2】:

我认为,self 指的是父窗口。要检查,请在浏览器控制台中输入以下内容并查看结果:

self == window

【讨论】:

  • 确实是这样,但问题是为什么要执行条件,而不是 self 指的是什么......虽然我认为这是混乱的一部分
【解决方案3】:

如果iframe 没有完全加载,.contentWindow 将返回null。看起来代码正在循环通过iframes,检查它们是否已加载,如果已加载,则调整它们的大小。

编辑:musefan 是对的;我用错了。

编辑 2:Why check that the window inside an iframe is the window inside an iframe? 如果尚未加载,则为 null;如果它被加载,它就是一个窗口。

【讨论】:

  • .contentWindow === self 是一个相等性检查,只会返回真或假。 .contentWindow 可能会返回 null,所以我认为这就是您的意思
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
相关资源
最近更新 更多