兼容多浏览器的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 相关文章推荐
通过 Dom 方法提高 innerHTML 性能
Mar 26 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
Dec 10 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
May 11 Javascript
javascript模拟map输出与去除重复项的方法
Feb 09 Javascript
jQuery Validate初步体验(一)
Dec 12 Javascript
基于jquery实现的仿优酷图片轮播特效代码
Jan 13 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
Apr 06 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
Oct 26 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
Node.js实现注册邮箱激活功能的方法示例
Mar 23 Javascript
使用vuex的state状态对象的5种方式
Apr 19 Javascript
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和ACCESS写聊天室(九)
2006/10/09 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
在Django中创建动态视图的教程
2015/07/15 Python
详解python中的json的基本使用方法
2016/12/21 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
python分析作业提交情况
2017/11/22 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
详解Python if-elif-else知识点
2018/06/11 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
python贪吃蛇游戏代码
2020/04/18 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
python实现的分层随机抽样案例
2020/02/25 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
毕业证代领委托书
2014/09/26 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
暂停营业通知
2015/04/25 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
html粘性页脚的具体使用
2022/01/18 HTML / CSS