兼容多浏览器的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 WEB操作方法分享
Feb 28 Javascript
javascript实现在指定元素中垂直水平居中
Sep 13 Javascript
js运动应用实例解析
Dec 28 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
Nov 10 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
Sep 30 Javascript
微信小程序上传图片功能(附后端代码)
Jun 19 Javascript
微信小程序合法域名配置方法
May 06 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
js实现石头剪刀布游戏
Oct 11 Javascript
微信小程序接入vant Weapp组件的详细步骤
Oct 28 Javascript
vue 通过base64实现图片下载功能
Dec 19 Vue.js
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
打造计数器DIY三步曲(上)
2006/10/09 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
Python解析nginx日志文件
2015/05/11 Python
使用python加密自己的密码
2015/08/04 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
公司员工的自我评价范例
2013/11/01 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
岗位职责说明书模板
2014/07/30 职场文书
干部培训工作总结2015
2015/05/25 职场文书
2016公司年会主持词
2015/07/01 职场文书
七年级作文之英语老师
2019/10/28 职场文书
vue 给数组添加新对象并赋值
2022/04/20 Vue.js
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android
5个实用的JavaScript新特性
2022/06/16 Javascript