如何设置iframe高度自适应在跨域情况下的可用方法


Posted in Javascript onSeptember 06, 2013

在页面上使用iframe来动态加载页面内容是网页开发中比较常见的方法。在父页面中给定一个不带滚动条的iframe,然后对属性src指定一个可加载的页面,这样当父页面被访问的时候,子页面可以被自动加载。iframe的高度需要根据子页面的实际高度来进行调整。如果iframe的高度小于子页面的实际高度,超出的部分无法显示;相反,如果iframe的高度过高,则页面上会出现大量的空白区域。我们可以通过属性或者CSS来设置iframe的高度,当不确定子页面内容的高度时,也可以通过脚本来进行动态指定。但是如果子页面不在同一域中怎么办?这时候脚本没有办法获取到子页面的高度,存在JavaScript跨域的问题!

如题所述,本文在介绍可用方法的同时,也向大家询问除下文列出来的方法之外是否还有其它方法可寻?

通过属性或CSS来设置iframe的高度这里就不再具体介绍了。首先来看看如何通过脚本进行设置。

function ChangeFrameHeight(id) { 
var count = 1; (function() { 
var frm = document.getElementById(id); 
var subWeb = document.frames ? document.frames[id].document : frm.contentDocument; 
if (subWeb != null) { 
var height = Math.max(subWeb.body.scrollHeight, subWeb.documentElement.scrollHeight); 
frm.height = height; 
} 
if (count < 3) { 
count = count + 1; 
window.setTimeout(arguments.callee, 2000); 
} 
})(); 
}

假设iframe子页面和父页面都在同一域内,通过该脚本可以对给定id的iframe高度进行动态调整。为了防止父页面在子页面之前加载完成,该函数会每隔2秒重新执行一次,一共执行3次。极端情况下子页面的加载速度会慢于父页面,可适当对执行次数和时间做调整。
<iframe frameborder="0" width="450" marginheight="0" marginwidth="0" scrolling="no" id="frm1" name="frm1" src="abc.html" onload="ChangeFrameHeight('frm1')"></iframe>

如果遇到子页面跨域的问题,可通过HTML5的postMessage来实现,但前提是子页面需要主动向父页面发送信息。下面是子页面部分:
<!DOCTYPE html> 
<head> 
</head> 
<body onload="parent.postMessage(document.body.scrollHeight, 'http://target.domain.com');"> 
<h3>Got post?</h3> 
<p>Lots of stuff here which will be inside the iframe.</p> 
</body> 
</html>

在父页面中获取到子页面传递过来的信息,然后对iframe的高度进行调整。
<script type="text/javascript"> 
function resizeCrossDomainIframe(id, other_domain) { 
var iframe = document.getElementById(id); 
window.addEventListener('message', function(event) { 
if (event.origin !== other_domain) return; // only accept messages from the specified domain 
if (isNaN(event.data)) return; // only accept something which can be parsed as a number 
var height = parseInt(event.data) + 32; // add some extra height to avoid scrollbar 
iframe.height = height + "px"; 
}, false); 
} 
</script> <iframe src='abc.html' id="frm1" onload="resizeCrossDomainIframe('frm1', 'http://example.com');"> 
</iframe>

有关如何使用HTML5的postMessage()方法可以查看这篇文章http://dev.w3.org/html5/postmsg/#web-messaging

但是在大多数情况下,iframe中所引用的子页面除了和父页面不在同一域之外,我们可能根本无法对子页面进行任何操作,或者说子页面根本没有提供Corss-document messaging功能。在这种情况下,通过postMessage()方法也无法获取到子页面的任何信息。由于无法和子页面进行任何交互,也就没有办法得知子页面的document对象,从未无法根据子页面的实际高度来调整父页面iframe的height属性了。

目前没有其它实际有效的方法来处理上面遇到的问题。默认情况下可以给iframe指定一个比较大的高度,这样假设所引用的子页面内容不会超出范围,除了在页面上会留下部分空白区域外,内容显示基本不会有问题。

那是否还存在其它比较有效的解决方法呢?期待!

Javascript 相关文章推荐
一个js拖拽的效果类和dom-drag.js浅析
Jul 17 Javascript
向当前style sheet中插入一个新的style实现方法
Apr 01 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
Aug 29 Javascript
不使用script导入js文件的几种方法
Oct 27 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
Dec 02 Javascript
整理关于Bootstrap表单的慕课笔记
Mar 29 Javascript
js时间查询插件使用详解
Apr 07 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
vue父组件向子组件(props)传递数据的方法
Jan 02 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
Aug 02 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 08 Javascript
Vue数字输入框组件使用方法详解
Feb 10 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 #Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 #Javascript
正负小数点后两位浮点数实现原理及代码
Sep 06 #Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
Sep 06 #Javascript
jquery实现metro效果示例代码
Sep 06 #Javascript
JS去除数组重复值的五种不同方法
Sep 06 #Javascript
JavaScript判断密码强度(自写代码)
Sep 06 #Javascript
You might like
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
windows xp下安装pear
2006/12/02 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
次世代生活态度:Hypebeast
2018/07/05 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
函授自我鉴定范文
2014/02/06 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
运动会宣传稿50字
2015/07/23 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
Python requests用法和django后台处理详解
2022/03/19 Python
Python实现双向链表
2022/05/25 Python