iframe自适应高度

来源:互联网 发布:ubuntu引导windows问题 编辑:程序博客网 时间:2024/06/03 15:08

 序言

  在网站开发过程中,iframe不怎么被推荐使用,有点类似Table的命运,但我个人认为有些地方使用iframe还是挺方便的,比如局部刷新和灵活控制响应结果的显示位置(我不喜欢整页整页地刷新)。也许存在其他的东西能够完美地替代iframe的这些功能,我也很乐意了解,可根据目前浅薄的见识,还不知道哪个可以(T_T),所以先把iframe搞清楚吧~

 正文

  使用iframe的时候,iframe高度能适应其嵌入的页面长度是非常必要的,因为很多时候被潜入的结果页面是动态生成的,预先根本不知道它会有多长,且被嵌入的页面内部可能另外又有一个iframe。本文先考虑单层iframe的情况,再解决多层嵌套iframe的高度更新问题。

一 单层iframe高度自适应

   如果只涉及一层iframe,则可以在主页面的body标签的onLoad事件中添加一个调整iframe高度的js函数,使得页面加载完成时(此时嵌入页面也加载完成了)刷新iframe的高度为被嵌入页面内容的高度,也可以在iframe的onLoad事件中添加调整高度的函数。例如这个函数为setIfrmHeight(iframeID),其内容如下,

function setIfrmHeight(id) {   /*实现iframe自适应内容高度,适用于ie和ff*/     var iframe = window.document.getElementById(id);     if (document.getElementById)      //如果document对象存在getElementById方法,几乎所有的浏览器都支持     {          if (iframe && !window.opera)  //如果浏览器不是opera          {              if (iframe.contentDocument && frame.contentDocument.body.offsetHeight)                   iframe.height = iframe.contentDocument.body.offsetHeight;               else if (iframe.Document && iframe.Document.body.scrollHeight)                  iframe.height = iframe.Document.body.scrollHeight;          }     } }

假设index.jsp中有一个iframe,其id为'FloatWd',上述的高度设置函数在文件chloe.js中,则只需要index.jsp的头部添上<SCRIPT type=text/javascript src="chloe.js"></SCRIPT>以引入js函数,接着在<body>中或者<iframe>中加上一句onLoad="SetIfrmHeight('FloatWd');"即可。之后无论index.jsp的iframe中载入哪个页面,iframe的高度都会自动适应其内容的高度,实现index框架与嵌入页面的无缝连接。在<body>中加入和在<iframe>中加入的区别是:<body>中的onLoad事件只有在页面载入完毕时才触发,之后动态更改其中iframe的内容则不会触发;而<iframe>中的onLoad事件在每次更改此iframe的src后都会触发,即重新载入子页面后触发。所以如果页面载入完毕后,如果可能动态改变iframe的内容,希望改变时iframe高度也能够自适应,则需要在<iframe>的onLoad事件中添加高度调整函数。

二 多层iframe高度自适应

   对于嵌套多层iframe的情况,采用前面的方法就不行了。假设index.jsp中通过iframe 'FloadWd'嵌入了页面main.jsp,而main.jsp中又有一个iframe 'SubFloadWd',嵌入了页面subpage.jsp,且main.jsp中会独立地更改SubFloadWd中的页面,此时就不能简单采用父页面调用高度调整函数的方法了,要逆向地在最底层的页面中调用函数调整父页面和父父页面中的iframe高度,因为main.jsp更新其iframe中的内容时,父页面index.jsp并没有触发载入事件,从而不会调用函数调整'FloadWd'的高度。

  此时需要有两个调整父页面iframe和父父页面iframe高度的函数,供subpage.jsp以及其他子页面在onLoad事件中调用,这两个函数跟前面的基本类似,只是获取的id是父页面中的内容。

function SetParentIfrmHeight(id){   var pIframe = window.parent.document.getElementById(id);   if (document.getElementById)   {       if (pIframe && !window.opera)       {          if(pIframe.contentDocument && pIframe.contentDocument.body.offsetHeight)               pIframe.height = pIframe.contentDocument.body.offsetHeight;          else if(pIframe.Document && pIframe.Document.body.scrollHeight)               pIframe.height = pIframe.Document.body.scrollHeight;       }   }} function SetPParentIframeHeight(id){   var ppIframe = window.parent.parent.document.getElementById(id);   if (document.getElementById)   {       if (ppIframe && !window.opera)       {           if(ppIframe.contentDocument && ppIframe.contentDocument.body.offsetHeight)               ppIframe.height = ppIframe.contentDocument.body.offsetHeight;           else if(ppIframe.Document && ppIframe.Document.body.scrollHeight)               ppIframe.height = ppIframe.Document.body.scrollHeight;       }    }}

之后在subpage.jsp中的<body>中加上onLoad="SetParentIfrmHeight('subFloatWd');SetPParentIframeHeight('FloatWd');"即可,当然引用包含上面两个函数js文件是必须的。

  对于三层、四层等多层嵌套,类似的添加调整上级页面中iframe的高度的函数,如果有三层iframe,则要有三种高度调整函数,四层则有四种高度调整函数,各个函数除了第一行提取iframe对象不同外,其他部分基本相同。

 总结

  其实对于单层的iframe的情况,逆向调整父页面中iframe的高度也是可行的,其思路也比较合理:当页面载入完成后调整包含自己的iframe的高度。当只有一个父页面,有很多个子页面时,逆向方法需要每个子页面都在onLoad事件中添加调整函数,比较繁琐,而正向调整本方法只用在一个父页面中添加一次调整函数就可以了。对于多层iframe的情况,正向处理只有在主页面载入时起作用,不能在主页面载入后继续灵活及时地调整iframe高度。根据应用的实际需要,可以采用不同的思路。

 篇外

  这里补充一下使用iframe的其他方面:

  (1) 让form提交后的结果页面显示在本页面的iframe区域内

      <form id="formID" name="formName" action="result.jsp" method="post" target="targetIframeName">

  (2) 隐藏iframe

      <iframe name="hiddenFrame" id="hiddenFrame" width="0" height="0" frameborder="0" style="display:none"></iframe>

    可以在Servlet处理完毕后给出js提示信息,此提示信息的目标通过(1)设置为当前页面的隐藏iframe中,这样既能自然得看到提示,也可以防止页面跳转。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 尖头鞋把尖折了怎么办 腰椎固定手术钢钉断了怎么办 脚被钢钉扎了怎么办 皮帘子有胶了怎么办 12v插口没有电怎么办 吃了一颗聚乙烯醇怎么办 立式注塑机产品粘膜怎么办 被小松鼠咬了怎么办 被宠物松鼠咬了怎么办 手被松鼠咬出血怎么办 银联认证码失败怎么办 国际汇款触发合规查询怎么办 外面的网线断了怎么办 网线被别的车挂断了怎么办 施工挖断军用光缆怎么办 不小心挖断光缆怎么办 家里的光纤断了怎么办 车被树枝刮花了怎么办 货车撞断了树枝怎么办? 把光缆挖断了怎么办 光缆有外伤断了怎么办 不小心挖断移动光缆怎么办 派克服内胆掉毛怎么办 汉王电纸书怎么无法开机怎么办? 压力喷水壶坏了怎么办 行车记录仪后摄像头不清楚怎么办 蓝牙听歌声音小怎么办 对讲机时灵时不灵怎么办 黑凉粉煮稀了怎么办 轮速传感器坏了怎么办 黑魂3被入侵了怎么办 轮胎螺丝滑牙了怎么办 gta5ol寻宝任务退出了怎么办 gta5线上模式买房子之后怎么办 开摩托车忘记带安全头盔怎么办 gta不想要车了怎么办 空气滤芯进水会怎么办 车胎扎了个钉子怎么办 德罗索没导弹了怎么办 CF手雷包不能用怎么办 cfAK爆头碰到狙怎么办