兼容多浏览器的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 相关文章推荐
[IE&amp;FireFox兼容]JS对select操作
Jan 07 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
JS预览图像将本地图片显示到浏览器上
Aug 25 Javascript
基于JS实现简单的样式切换效果代码
Sep 04 Javascript
js canvas仿支付宝芝麻信用分仪表盘
Nov 16 Javascript
教你用Cordova打包Vue项目的方法
Oct 17 Javascript
详解js静态检查工具eslint配置文件
Nov 23 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
Jan 30 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 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
关于尾递归的使用详解
2013/05/02 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
零基础php编程好学吗
2019/10/11 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
学习ExtJS border布局
2009/10/08 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
代码分析Python地图坐标转换
2018/02/08 Python
python实现电脑自动关机
2018/06/20 Python
python批量赋值操作实例
2018/10/22 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
python opencv实现简易画图板
2020/08/27 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
2014年化验室工作总结
2014/11/21 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
SQL注入详解及防范方法
2021/12/06 MySQL