如何设置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 相关文章推荐
30个最好的jQuery 灯箱插件分享
Apr 25 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
Sep 04 Javascript
jquery实现input框获取焦点的方法
Feb 06 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
Vue 组件传值几种常用方法【总结】
May 28 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
vue中的自定义分页插件组件的示例
Aug 18 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
如何测量vue应用运行时的性能
Jun 21 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
Apr 11 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
PHP的开发框架的现状和展望
2007/03/16 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
Vue事件处理原理及过程详解
2020/03/11 Javascript
javascript实现计算器功能
2020/03/30 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
关于廉洁的广播稿
2014/01/30 职场文书
工程承包协议书范本
2014/09/29 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书