兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)


Posted in Javascript onNovember 04, 2009

小项目龙里中学多媒体教室管理系统中后台管理用到了iframe.由于要动态载入内容,所以需要iframe自适应内容页的高度.用谷歌搜索到很多答案,其中成功的是这段代码

<script type="text/javascript"> 
function SetCwinHeight() { 
var iframeid = document.getElementById("maincontent1"); //iframe id 
if (document.getElementById) { 
if (iframeid && !window.opera) { 
if (iframeid.contentDocument && iframeid.contentDocument.body.offsetHeight) { 
iframeid.height = iframeid.contentDocument.body.offsetHeight; 
} else if (iframeid.Document && iframeid.Document.body.scrollHeight) { 
iframeid.height = iframeid.Document.body.scrollHeight; 
} 
} 
} 
} 
</script>

iframe代码:
<iframe style="z-index: 1; visibility: inherit; width: 100%;" name="maincontent1" 
onload="Javascript:SetCwinHeight()" height="1" id="maincontent1" src="<%=ResolveClientUrl("~/message")%>" 
marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe>

在IE8下成功实现自适应高度,但在谷歌浏览器高度只会增加,不会减少,也就是说,长高后就缩不回来.
那么各个浏览器的表现不太相同,单取哪个值都不对。但可以找到了一条规律,那就是取两个值得最大值可以兼容各浏览器。所以我们的主页面代码就要改造成这样了:
function reinitIframe(){var iframe = document.getElementById("frame_content"); 
try{ 
var bHeight = iframe.contentWindow.document.body.scrollHeight; 
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight; 
var height = Math.max(bHeight, dHeight); 
iframe.height = height; 
}catch (ex){} 
} 
window.setInterval("reinitIframe()", 200);

这样子,基本解决了兼容性问题。顺便说下,不光绝对定位的层会影响到值,float也会导致两个值的差异。
如果你演示Demo后,会发现,除了IE,其他浏览器中,当层展开后再隐藏,取到的高度值还是维持在展开的高度303,而非隐藏回去的真正值184,就是说长高了之后缩不回去了。这个现象在不同被包含页面之间做切换也会发生,当从高的页面切换到矮页面的时候,取到的高度还是那个高的值。
可以归纳为,当iframe窗体高度高于文档实际高度的时候,高度取的是窗体高度,而当窗体高度低于实际文档高度时,取的是文档实际高度。因此,要想办法在同步高度之前把高度设置到一个比实际文档低的值。所以,在iframe的添加 onload=”this.height=100″,让页面加载的时候先缩到足够矮,然后再同步到一样的高度。
这个值,在实际应用中决定,足够矮但又不能太矮,否则在FF等浏览器里会有很明显的闪烁。DOM操作的时候主页面无法监听到,只能DOM操作完了之后把高度变小了。
在我的一个实际项目中,在成本和收益之间权衡,我并没有做这个事情,因为每个DOM函数中都要插入这个代码,代价太高,其实层缩回去不缩掉也不是那么致命。包括Demo里,也没有去做这个事情。如果读者有更好的方法,请告诉我。
/**********************************原文引用结束***************************** /
请注意红色的这句.读到这里,我想在改变iframe.height之前可否先给 iframe.height赋一个够小的初始值,如iframe.height="10px",然后再改变如iframe.height.这样就解决了原文红色部分的问题。
最终代码如下:
<script type="text/javascript"> 
function SetCwinHeight() { 
var iframeid = document.getElementById("maincontent1"); //iframe id 
iframeid.height = "10px";//先给一个够小的初值,然后再长高. 
if (document.getElementById) { 
if (iframeid && !window.opera) { 
if (iframeid.contentDocument && iframeid.contentDocument.body.offsetHeight) { 
iframeid.height = iframeid.contentDocument.body.offsetHeight; 
} else if (iframeid.Document && iframeid.Document.body.scrollHeight) { 
iframeid.height = iframeid.Document.body.scrollHeight; 
} 
} 
} 
} 
</script>

iframe代码仍然不变:
<iframe style="z-index: 1; visibility: inherit; width: 100%;" name="maincontent1" 
onload="Javascript:SetCwinHeight()" height="1" id="maincontent1" src="<%=ResolveClientUrl("~/message")%>" 
marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe>

经测试,iframe在ie8 、谷歌浏览器4.0和 firefox3.5.3均成功自适应高度.
Javascript 相关文章推荐
Javascript 构造函数 实例分析
Nov 26 Javascript
js切换div css注意的细节
Dec 10 Javascript
jQuery判断元素是否存在的可靠方法
May 06 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
Dec 17 Javascript
深入探寻javascript定时器
Jan 02 Javascript
javascript实现博客园页面右下角返回顶部按钮
Feb 22 Javascript
jquery select2的使用心得(推荐)
Dec 04 Javascript
Three.js中网格对象MESH的属性与方法详解
Sep 27 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
node 使用 async 控制并发的方法
May 07 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
jQuery实现轮播图源码
Oct 23 jQuery
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
Nov 04 #Javascript
jQuery 加上最后自己的验证
Nov 04 #Javascript
javascript Math.random()随机数函数
Nov 04 #Javascript
jquery animate 动画效果使用说明
Nov 04 #Javascript
JavaScript window.setTimeout() 的详细用法
Nov 04 #Javascript
javascript 限制输入脚本大全
Nov 03 #Javascript
jquery ajax 检测用户注册时用户名是否存在
Nov 03 #Javascript
You might like
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
Jquery插件之多图片异步上传
2010/10/20 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
详解js闭包
2014/09/02 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python中PIL安装简单教程
2016/04/21 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
党员公开承诺事项
2014/03/25 职场文书
新春寄语大全
2014/04/09 职场文书
综治维稳工作汇报
2014/10/27 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
2016年教师新年寄语
2015/08/18 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang