黑帽联盟

 找回密码
 会员注册
查看: 1541|回复: 0
打印 上一主题 下一主题

[html] iframe框架自适应高度多种方法总结

[复制链接]

852

主题

38

听众

3175

积分

白金VIP

Rank: 8Rank: 8

  • TA的每日心情
    开心
    2024-3-7 12:52
  • 签到天数: 1538 天

    [LV.Master]伴坛终老

    对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的

    不带边框的ifra--me因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 ifra--me的大小却不像层那样可以“伸缩自如”,所以带来了使用上的麻烦,给ifra--me设置高度的时候多了也不好,少了更是不行,现在,让我来告诉大 家一种ifra--me动态调整高度的方法,主要是以下JS函数:

    第一种方法:代码简单,兼容性还可以,大家可以先测试下。
    代码如下:
    function SetWinHeight(obj)
    {
    var win=obj;
    if (document.getElementById)
    {
    if (win && !window.opera)
    {
    if (win.contentDocument && win.contentDocument.body.offsetHeight)
    win.height = win.contentDocument.body.offsetHeight;
    else if(win.Document && win.Document.body.scrollHeight)
    win.height = win.Document.body.scrollHeight;
    }
    }
    }

    最后,加入ifra--me,不能丢掉onload属性,当然了,id也必须也函数中的win匹配

    代码如下:
    <ifra--me width="778" align="center" height="200" id="win" name="win" frameborder="0" scrolling="no" src="1.htm"></ifra--me>

    这么的这种也是跟上面的解决方法类似的代码
    经典代码 ifra--me 自适应高度,在IE6/IE7/IE8/Firefox/Opera/Chrome/Safari通过测试。
    HTML代码:
    代码如下:
    <ifra--me src="https://bbs.cnblackhat.com/" id="ifra--mepage" name="ifra--mepage" frameBorder=0 scrolling=no width="100%" ></ifra--me>Javascript代码:
    <script type="text/javascript" language="javascript">
    function ifra--meHeight() {
    var ifm= document.getElementById("ifra--mepage");
    var subWeb = document.frames ? document.frames["ifra--mepage"].document : ifm.contentDocument;
    if(ifm != null && subWeb != null) {
    ifm.height = subWeb.body.scrollHeight;
    }
    }
    </script>


    下面这个兼容性更好一些
    代码如下:
    <script language="javascript" type="text/javascript">
    function dynifra--mesize(down) {
    var pTar = null;
    if (document.getElementById){
    pTar = document.getElementById(down);
    }
    else{
    eval('pTar = ' + down + ';');
    }
    if (pTar && !window.opera){
    //begin resizing ifra--me
    pTar.style.display="block"
    if (pTar.contentDocument && pTar.contentDocument.body.offsetHeight){
    //ns6 syntax
    pTar.height = pTar.contentDocument.body.offsetHeight +20;
    pTar.width = pTar.contentDocument.body.scrollWidth+20;
    }
    else if (pTar.Document && pTar.Document.body.scrollHeight){
    //ie5+ syntax
    pTar.height = pTar.Document.body.scrollHeight;
    pTar.width = pTar.Document.body.scrollWidth;
    }
    }
    }
    </script>
    <ifra--me src ="/default2.aspx" frameborder="0" marginheight="0" marginwidth="0" frameborder="0" scrolling="auto" id="ifm" name="ifm" width="100%">
    </ifra--me>


    另一种情况的ifra--me解决方案(超简单)
    重要提示:src=中你必须填写的网页地址,一定要和本页面在同一个站点上,否则,会抱错,说“拒绝访问!”(实际上这是因为Js的跨域问题导致拒绝访问的)
    之前自己也碰到过这个问题,为了得到答案去网上搜索,发现有不少人也遇到了这样的问题,现在就把解决方法共享一下
    1、建立一个bottom.js的文件,然后输入下面的代码(只有两行哦)
    代码如下:
    parent.document.all("框架ID名").style.height=document.body.scrollHeight;
    parent.document.all("框架ID名").style.width=document.body.scrollWidth;

    这里的 框架ID名 就是ifra--me的ID,比如:
    代码如下:

    <ifra--me id="框架ID名" name="left" frameBorder=0 scrolling=no src="XXX.asp" width="100%"></ifra--me>

    2、给你网站里所有的被包含文件里面每个都加入
    代码如下:
    <script language = "JavaScript" src = "bottom.js"/></script>

    3、OK,收工!
    在WINXP、IE6下面测试通过。很简单吧!
    实现 ifra--me 的自适应高度
    实现 ifra--me 的自适应高度,能够随着页面的长度自动的适应以免除页面和 ifra--me 同时出现滚动条的现象。
    代码如下:

    <script type="text/javascript">
    //** ifra--me自动适应页面 **//
    //输入你希望根据页面高度自动调整高度的ifra--me的名称的列表
    //用逗号把每个ifra--me的ID分隔. 例如: ["myframe1", "myframe2"],可以只有一个窗体,则不用逗号。
    //定义ifra--me的ID
    var ifra--meids=["test"]
    //如果用户的浏览器不支持ifra--me是否将ifra--me隐藏 yes 表示隐藏,no表示不隐藏
    var ifra--mehide="yes"
    function dynifra--mesize()
    {
    var dynifra--me=new Array()
    for (i=0; i<ifra--meids.length; i++)
    {
    if (document.getElementById)
    {
    //自动调整ifra--me高度
    dynifra--me[dynifra--me.length] = document.getElementById(ifra--meids);
    if (dynifra--me && !window.opera)
    {
    dynifra--me.style.display="block"
    if (dynifra--me.contentDocument && dynifra--me.contentDocument.body.offsetHeight) //如果用户的浏览器是NetScape
    dynifra--me.height = dynifra--me.contentDocument.body.offsetHeight;
    else if (dynifra--me.Document && dynifra--me.Document.body.scrollHeight) //如果用户的浏览器是IE
    dynifra--me.height = dynifra--me.Document.body.scrollHeight;
    }
    }
    //根据设定的参数来处理不支持ifra--me的浏览器的显示问题
    if ((document.all || document.getElementById) && ifra--mehide=="no")
    {
    var tempobj=document.all? document.all[ifra--meids] : document.getElementById(ifra--meids)
    tempobj.style.display="block"
    }
    }
    }
    if (window.addEventListener)
    window.addEventListener("load", dynifra--mesize, false)
    else if (window.attachEvent)
    window.attachEvent("onload", dynifra--mesize)
    else
    window.onload=dynifra--mesize
    </script>

    第三中方法批量ifra--me自适应:
    工作中遇到ifra--me随所含内容自适应高度的问题,以前在网上看到过类似问题的解决方法,于是搜索一下,找到了一个比较完整的能够兼容浏览器的解决方法,省得自己写了。
    虽然不用自己写,思路还是要明白,基本上就是取得ifra--me属性src所指定的包含文档中内容的高度,然后用来设置ifra--me自身的高度,在ifra--me所在页面载入时对页面中的所有需要自适应高度的ifra--me进行自动设置,省时省力,如果确定页面中全部ifra--me都需要自适应高度,直接取得ifra--me数组给代码,就连ID都不用自己写了,完成程序搞定。(代码贴上来:)
    代码如下:

    <script language="javascript">
    //输入你希望根据页面高度自动调整高度的ifra--me的名称的列表
    //用逗号把每个ifra--me的ID分隔. 例如: ["myframe1", "myframe2"],可以只有一个窗体,则不用逗号。
    //定义ifra--me的ID
    var ifra--meids=["test"];
    //如果用户的浏览器不支持ifra--me是否将ifra--me隐藏 yes 表示隐藏,no表示不隐藏
    var ifra--mehide="yes";
    function dynifra--mesize()
    {
    var dynifra--me=new Array()
    for (i=0; i<ifra--meids.length; i++)
    {
    if (document.getElementById)
    {
    //自动调整ifra--me高度
    dynifra--me[dynifra--me.length] = document.getElementById(ifra--meids);
    if (dynifra--me && !window.opera)
    {
    dynifra--me.style.display="block";
    if (dynifra--me.contentDocument && dynifra--me.contentDocument.body.offsetHeight) //如果用户的浏览器是NetScape
    dynifra--me.height = dynifra--me.contentDocument.body.offsetHeight;
    else if (dynifra--me.Document && dynifra--me.Document.body.scrollHeight) //如果用户的浏览器是IE
    dynifra--me.height = dynifra--me.Document.body.scrollHeight;
    }
    }
    //根据设定的参数来处理不支持ifra--me的浏览器的显示问题
    if ((document.all || document.getElementById) && ifra--mehide=="no")
    {
    var tempobj=document.all? document.all[ifra--meids] : document.getElementById(ifra--meids);
    tempobj.style.display="block";
    }
    }
    }
    if (window.addEventListener)
    window.addEventListener("load", dynifra--mesize, false);
    else if (window.attachEvent)
    window.attachEvent("onload", dynifra--mesize);
    else
    window.onload=dynifra--mesize;
    </script>


    网上有人改进了方法,解决了当ifra--me所包含文档内容高度动态变化时自动调整ifra--me高度的问题,原理是在ifra--me所在页面不断扫描ifra--me包含文档的内容高度并改变ifra--me自身高度,这种方法貌似解决了问题,但是对页面速度和系统资源占用是否有影响还很难说,感觉方法有些偏执,应该有更好的解决方法。

    第四种方法,只针对知道的ifra--me的ID调用 不推荐
    代码如下:

    function ifra--meAutoFit(ifra--meObj){
        setTimeout(function(){if(!ifra--meObj) return;ifra--meObj.height=(ifra--meObj.Document?ifra--meObj.Document.body.scrollHeight:ifra--meObj.contentDocument.body.offsetHeight);},200)
    }
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部