iframe 与父窗口

如果iframe的出现是一个错误的话,iframe里边在来一个iframe那是错上加错,神话没有在远古的尘嚣中消失,却在怀具的今天不断上演。
生活永远是一个大染缸,一块白布下去,黑布出来,一块黑布下去,一块七色布出来。
contentWindow 兼容各个浏览器,可取得子窗口的 window 对象。
contentDocument Firefox 支持,> ie8 的ie支持。可取得子窗口的 document 对象。

// 获取父窗口滚动高度
$(parent.document).scrollTop()

在子级iframe设置 父级 iframe ,或 孙级 iframe 高度:

function showIframeH(){
    var parentWin = parent.document.getElementById("test");
    if(!parentWin) return false;    

    var sub = parentWin.contentWindow.document.getElementById("test2");
    if(!sub) return false;    

    var thirdHeight = sub.contentWindow.document.body.offsetHeight; //第三层body对象    
    sub.height = thirdHeight; //设置第二层 iframe 的高度    

    var secondHeight = x.contentWindow.document.body.offsetHeight; //第二层body对象
    x.height = secondHeight; //设置第一层 iframe 的高度

    //alert(secondHeight);
    //alert('body: ' + x.contentDocument.body.offsetHeight + ' div:' + thirdHeight);
}

页面A包含几个标签,在切换标签时,高度会变化。页面B用iframe引用了页面A,并且在A载入完成时,把iframe的高度设为了页面A的高度(调用一个自定义的adjustHeight()函数)。可是在切换标签时,iframe的高度并不会变化,就出现滚动条了。
这个问题的难点在于页面B是框架自动生成的,我没法更改,只能在页面A里修复这个问题。

当然,这个问题的前提是页面A和B是同域的,因为JavaScript无权跨域访问。
于是问题就变成了如何在页面A中获取包含它的iframe对象。

查了半天资料后,我发现DOM确实没提供这个API,于是想到了另一个办法:获取父窗口中所有的iframe对象,遍历它们的,将其contentWindow属性与self比较,相等则表示是包含页面A的那个iframe:
function resetHeight() {
    if (!parent) {
        return;
    }
    var iframes = parent.document.getElementsByTagName('iframe');
    var length = iframes.length;
    if (length == 0) {
        return;
    }
    try {
        for (var i = 0; i < length; ++i) {
            var iframe = iframes[i];
            if (iframe.contentWindow === self) {
                parent.adjustHeight(iframe);
                return;
            }
        }
    } catch (e) {
    }
}

最后说下document.getElementsByTagName('iframe')与frames的区别。
前者得到的是HTMLIFrameElement对象的数组,每个对象都是一个DOM元素;
后者得到的是DOMWindow对象的数组,也就是窗口的数组。
而HTMLIFrameElement对象有个contentWindow属性,这个属性就是frames之中的窗口对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值