兼容多浏览器的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 相关文章推荐
BOM与DOM的区别分析
Oct 26 Javascript
jQuery取消ajax请求的方法
Jun 09 Javascript
JS实现从网页顶部掉下弹出层效果的方法
Aug 06 Javascript
AngularJS在IE8的不支持的解决方法
May 13 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
vue实现tab栏点击高亮效果
Aug 19 Javascript
Vue中computed和watch有哪些区别
Dec 19 Vue.js
详解node.js创建一个web服务器(Server)的详细步骤
Jan 15 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语言构造器介绍
2013/07/08 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python ddt实现数据驱动
2018/03/14 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
python实现图片九宫格分割
2021/03/07 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
彪马日本官网:PUMA日本
2019/01/31 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
init进程的作用
2015/08/20 面试题
实习指导老师评语
2014/04/26 职场文书
新党章心得体会
2014/09/04 职场文书
领导班子对照检查材料
2014/09/22 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers