兼容多浏览器的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 相关文章推荐
jQuery 一个图片切换的插件
Oct 09 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 Javascript
jquery限定文本框只能输入数字即整数和小数
Nov 29 Javascript
3个可以改善用户体验的AngularJS指令介绍
Jun 18 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
Jun 15 Javascript
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
vue :src 文件路径错误问题的解决方法
May 15 Javascript
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
vue Element左侧无限级菜单实现
Jun 10 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
YB217、YB235、YB400浅听
2021/03/02 无线电
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
javascript 回调函数详解
2014/11/11 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
python使用urllib2提交http post请求的方法
2015/05/26 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
利用指针变量实现队列的入队操作
2012/04/07 面试题
启动仪式策划方案
2014/06/14 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis