如何设置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 相关文章推荐
Javascript SHA-1:Secure Hash Algorithm
Dec 20 Javascript
用js遍历 table的脚本
Jul 23 Javascript
两个比较有用的Javascript工具函数代码
Feb 17 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
简单的Jquery遮罩层代码实例
Nov 14 Javascript
JavaScript中匿名、命名函数的性能测试
Sep 04 Javascript
jQuery选择器源码解读(二):select方法
Mar 31 Javascript
贴近用户体验的Jquery日期、时间选择插件
Aug 19 Javascript
angular2中使用第三方js库的实例
Feb 26 Javascript
Webpack 之 babel-loader文件预处理器详解
Mar 23 Javascript
Vue 动态组件与 v-once 指令的实现
Feb 12 Javascript
JavaScript enum枚举类型定义及使用方法
May 15 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
Snoopy类使用小例子
2008/04/15 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
小议javascript 设计模式 推荐
2009/10/28 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
python验证码识别实例代码
2018/02/03 Python
详解python实现线程安全的单例模式
2018/03/05 Python
详解python单元测试框架unittest
2018/07/02 Python
python中map的基本用法示例
2018/09/10 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
简单了解python的break、continue、pass
2019/07/08 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
员工辞职信范文大全
2015/05/12 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
python井字棋游戏实现人机对战
2022/04/28 Python