iframe 高度根据子页面来确定
标题 | 描述 |
---|---|
一、解决方法 | 解决代码 |
二、关于高度问题 |
简单讲一下jquery中的 height() ,innerHeight() 、outHeight() ,js中的 offsetHeight 、clientHeight 、scrollHeight 。如何获取没有给出高度的元素的高度? 详细介绍offsetHeight,clientHeight,scrollHeight之间的区别 |
三、试验历程 | 例举了一下我写这个遇到的坑,以及怎么得出最后的方案。 |
一、解决方法
因为我这是 宽度已知,整体居中的布局,滚动条加在 iframe 标签上会很奇怪,而且iframe的高度不确定,所以滚动条只能加给父级body上。
//自动计算Iframe的高度
(function(){//根据ID获取iframe对象var ifr = document.getElementById('iframe-box'); ifr.onload = function() { //DOM0级事件,没有兼容var timer = setTimeout(function(){clearTimeout(timer);//解决打开高度太高的页面后再打开高度较小页面滚动条不收缩ifr.style.height='0px';var iDoc = ifr.contentDocument || ifr.document || ifr.contentWindow;var height = Math.max(calcPageHeight(iDoc));ifr.style.height = height + "px";},200) }// 计算页面的实际高度,iframe自适应会用到function calcPageHeight(doc) {var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight);var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight);var height = Math.max(cHeight, sHeight);return height;}
})();
注意:
(1)iframe 是双标签,需要结尾:<iframe></iframe>
(2)iframe 标签中的 scrolling 要为 “no”,禁止 iframe 的滚动条;
(3)记得使用延时器,因为 iframe 中有异步操作,iframe中的DOM结构和资源加载完成,可能异步还没有执行完,所以用延时器改变一下加载 iframe 子元素高度的顺序。
(4)如果需要对同 iframe 做相同事件,但是逻辑不同的操作,使用事件监听。
//事件监听的封装函数---通过事件监听写的逻辑操作也称 DOM2级事件。DOM2级事件存在兼容问题
function addEvent(ele,type,callback){
if(ele.addEventListener){
ele.addEventListener(type,callback,false);
} else if(ele.attachEvent){
ele.attachEvent("on"+type,callback);
} else {
ele["on"+type] = callback;
}
}
//使用
addEvent(obox,"click",function(){
console.log(1);
})
(5)有时候本地调试的时候,比如打开的文件在浏览器开头为 file://
浏览器也会默认为跨域页面,这时候只需要自己搭建一个服务器环境(phpnow
之类的都可以),就可以了;
(5)jquery 写 onload 事件的写法:
$("#iframe").load(function(){//...
})
(6)可参考资料:iframe 动态onload事件处理方式
(7)其他:图片onload事件详解,兼容所有浏览器!
二、关于高度
如何获取没有给出高度的元素的高度?
alert($(window).height()); //浏览器当前窗口可视区域高度
alert($(document).height()); //浏览器当前窗口文档的高度
alert($(document.body).height());//浏览器当前窗口文档body的高度
alert($(document.body).outerHeight(true));//浏览器当前窗口文档body的总高度 包括border padding margin
alert($(window).width()); //浏览器当前窗口可视区域宽度
alert($(document).width());//浏览器当前窗口文档对象宽度
alert($(document.body).width());//浏览器当前窗口文档body的高度
alert($(document.body).outerWidth(true));//浏览器当前窗口文档body的总宽度 包括border padding margin
三、试验历程
1. 参考 怎么让iframe的高度和宽度可以100%
<iframe name="right" id="center_cent" src="center/center0.html" width="100%" frameborder="0" onload='this.style.height=Math.max(this.contentWindow.document.body.scrollHeight,this.contentWindow.document.documentElement.scrollHeight,200)+"px"; '>
</iframe>
这里 onload 中写的是 this.style.height
,有的是直接写this.height
,二者的区别是,前面是给 iframe
添加 css 样式,把 height
作为 css 中的属性。后者是把 height
当做 iframe
标签 中的内置可见属性,
一开始参考这里面的代码,发现有个问题:
当iframe 中有异步操作时,高度获取有时候不准确,不是子页面的实际高度;当网速较慢时,高度几乎都能计算出并获取子页面的高度。
2. 参考iframe嵌套界面自适应,可高度自由收缩
之后参考了这个博主的文章,但是还是会碰到上面的问题,只是会给页面一个固定高度,当我子页面的高度>这个固定高度时,子页面多出的部分会被隐藏掉。
<script>// 计算页面的实际高度,iframe自适应会用到function calcPageHeight(doc) {var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)var height = Math.max(cHeight, sHeight)return height}//根据ID获取iframe对象var ifr = document.getElementById('iframe-box');ifr.onload = function() {//解决打开高度太高的页面后再打开高度较小页面滚动条不收缩ifr.style.height='0px';var iDoc = ifr.contentDocument || ifr.documentvar height = calcPageHeight(iDoc)if(height < 850){height = 850;}ifr.style.height = height + 'px'}
</script>
3. 解决首次弹出层iframe框架时,iframe框架所调用的页面高度和宽度取不到的问题
然后发现了这篇文章,上面问题导致的原因,可能是获取高度和iframe加载的顺序上面不对,通用延时函数setTimeout来调整执行顺序即可解决。
$(function () {setTimeout(function () {//在这里就可以获取到页面元素高度}, 0);
});
iframe 高度根据子页面来确定相关推荐
- 在父页面用Iframe加载子页面时,将父页面的title替换成子页面title
报告管理 转载于:https://www.cnblogs.com/maomojun/p/9667320.html
- 【转】js之iframe子页面与父页面通信
2019独角兽企业重金招聘Python工程师标准>>> iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 ...
- iframe父页面与子页面之间的传值问题
一.父页面给iframe中的子页面传值,把值写入子页面的文本框里 father.html <script language="javascript" src="ht ...
- 如何设置iframe高度自适应,在跨域的情况下能做到吗?
2019独角兽企业重金招聘Python工程师标准>>> 在页面上使用iframe来动态加载页面内容是网页开发中比较常见的方法.在父页面中给定一个不带滚动条的iframe,然后对属性s ...
- iframe中由一个页面跳转到另一个页面
1.HTML(父页面中存放iframe) <div ><iframe scrolling="no" id="main" name=" ...
- iframe父页面与子页面如何传值
一.父页面向子页面传值 parent.vue <template><iframe id="iframe" width="100%" :src= ...
- iframe子页面position的fixed
前言: 首先说一说我昨天天的苦逼经历.中午吃饭时一同事跟我说,他做的项目嵌套iframe后,子页面的position设置fixed失效了. 经过反复询问,得知他用了两层iframe,再加上最外的父页面 ...
- iframe子页面操作父页面
2019独角兽企业重金招聘Python工程师标准>>> 最近经常用到iframe,用的最多的就是在子页面中操作父页面的方法或变量等,总结了用到的几种方法,如下: var tableN ...
- iframe 父页面与子页面之间的方法的相互调用
2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...
最新文章
- 外卖小哥转行IT面完阿里后,又回去送外卖了,真实经历!
- Batch Normalization学习笔记
- LCA 在线倍增法 求最近公共祖先
- Sleuth则是用来共方便的集成Zipkin。
- Sqlite3_prepare
- 类对象工厂设计模式(Factory Pattern)
- android tablelayout 点击,Android Design之TableLayout选项卡
- CAD插件学习系列教程(五) 小菜选择易
- 电脑缺少网卡驱动不能上网
- matlab插值拟合
- 65.(cesium篇)cesium单个地图图片
- 2022-2028全球与中国期权及期货交易平台市场现状及未来发展趋势
- 稳压二极管TVS二极管
- HCNP RoutingSwitching之MAC地址防漂移
- 工厂模式--简单工厂模式--抽象工厂模式
- 清华计算机系残疾学生,清华学霸矣晓沅:拖拽着残疾的身体,追求生命的完美...
- CentOS Linux 内核升级
- 微信公众号h5页面禁止用户调整字体大小
- 手工制作绿色版 QQ 和 TM
- rtsp流通过ffmpeg+nginx转成rtmp以及http-flv流
热门文章
- 深度学习框架Keras介绍及实战
- win7下装ubuntu14.04双系统
- 再论EM算法的收敛性和K-Means的收敛性
- 关于图连通性的几道题(水)
- zbox mysql_20190213云服务器部署禅道
- 错误C4996:'std :: _Copy_impl'
- python while循环if_详解python基础之while循环及if判断
- 学计算机单招可以报那几个公立学校,为什么要选择公办单招学校,四川公办单招学校有哪些?...
- Python应用实战-Python爬取4000+股票数据,并用plotly绘制了树状热力图(treemap)
- python27怎么使用_pygtk:glade的使用(针对python27的第一个例子)