兼容多浏览器的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 Event学习第五章 高级事件注册模型
Feb 07 Javascript
Chrome Form多次提交表单问题的解决方法
May 09 Javascript
javascript错误的认识不用关心内存管理
Dec 15 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
Oct 21 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
Node.js的环境安装配置(使用nvm方式)
Oct 11 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
Vue EventBus自定义组件事件传递
Jun 25 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
ES10 特性的完整指南小结
Mar 04 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
Apr 24 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 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中的流(streams)浅析
2015/07/02 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
JavaScript 的继承
2011/10/01 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python读取注册表中值的方法
2013/04/08 Python
Python3实现生成随机密码的方法
2014/08/23 Python
Python端口扫描简单程序
2016/11/10 Python
python实现决策树分类算法
2017/12/21 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
python中wx模块的具体使用方法
2020/05/15 Python
Python无损压缩图片的示例代码
2020/08/06 Python
生产车间主任的个人自我鉴定
2013/10/25 职场文书
大学生找工作推荐信范文
2013/11/28 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书