兼容多浏览器的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 相关文章推荐
使用Mootools动态添加Css样式表代码,兼容各浏览器
Dec 12 Javascript
JQuery触发事件例如click
Sep 11 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
Dec 30 Javascript
window.location 对象所包含的属性
Oct 10 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
js限制input标签中只能输入中文
Jun 26 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 Javascript
JavaScript门面模式详解
Oct 19 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 Javascript
基于axios 解决跨域cookie丢失的问题
Sep 26 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
什么是MVC,好东西啊
2007/05/03 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
JS中递归函数
2016/06/17 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
Python计算字符宽度的方法
2016/06/14 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
python解决字符串倒序输出的问题
2018/06/25 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
物理教师自荐信范文
2013/12/28 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
个人工作表现评价材料
2014/09/21 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
反邪教观后感
2015/06/11 职场文书
人与自然的观后感
2015/06/18 职场文书
小学毕业感言200字
2015/07/30 职场文书
人民币使用说明书
2019/04/17 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python