Iframe高度自适应(兼容IE/Firefox、同域/跨域)
在实际的项目进行中,很多地方可能由于历史原因不得不去使用iframe,包括目前正火热的应用开发也是如此。
随之而来的就是在实际使用iframe中,会遇到iframe高度的问题,由于被嵌套的页面长度不固定而显示出来的滚动条,不仅影响美观,还会对用户操作带来不便。于是自动调整iframe的高度就成为本文的重点。
采用JavaScript来控制iframe元素的高度是iframe高度自适应的关键,同时由于JavaScript对不同域名下权限的控制,引发出同域、跨域两种情况。
同域时Iframe高度自适应
下面的代码兼容IE/Firefox浏览器,控制id为“iframeid”的iframe的高度,通过JavaScript取得被嵌套页面最终高度,然后在主页面进行设置来实现。
代码如下,可复制。另外,请注意此解决方案仅供同域名下使用。
function SetCwinHeight(){
var iframeid=document.getElementById("iframeid"); //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 width="100%" id="iframeid" onload="Javascript:SetCwinHeight()" height="1" frameborder="0" src="kimi.php"></iframe>
跨域时Iframe高度自适应
在主页面和被嵌套的iframe为不同域名的时候,就稍微麻烦一些,需要避开JavaScript的跨域限制。
原理:现有iframe主页面main.html、被iframe嵌套页面iframe.html、iframe中介页面agent.html三个,通过main.html(域名为http://www.ccvita.com)嵌套iframe.html(域名为:http://www.phpq.net),当用户浏览时执行iframe.html中的JavaScript代码设置iframeC的scr地址中加入iframe页面的高度,agent.html(域名为:http://www.ccvita.com)取得传递的高度,通过JavaScript设置main.html中iframe的高度。最终实现预期的目标。
演示地址:http://www.ccvita.com/wp-content/uploads/demo/iframe/main.html
代码下载:http://www.ccvita.com/wp-content/uploads/demo/iframe/iframe.zip
iframe主页面main.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>iframe主页面</title></head>
<body>
<div style="border:1px solid #ccc;padding:10px;">
<iframe id="frame_content" name="frame_content" src="iframe.html" width="100%" height="0" scrolling="no" frameborder="0"></iframe>
</div>
<br />尾部<br />
</body>
</html>
iframe嵌套页面iframe.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>被iframe嵌套页面</title></head>
<body>
文字<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
文字<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
文字<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
文字<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<iframe id="iframeC" name="iframeC" src="" width="0" height="0" style="display:none;" ></iframe>
<script type="text/javascript">
function sethash(){
hashH = document.documentElement.scrollHeight;
urlC = "agent.html";
document.getElementById("iframeC").src=urlC+"#"+hashH;
}
window.onload=sethash;
</script>
</body>
</html>
iframe中介页面agent.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>iframe中介页面</title></head>
<body>
<script>
function pseth() {
var iObj = parent.parent.document.getElementById('frame_content');
iObjH = parent.parent.frames["frame_content"].frames["iframeC"].location.hash;
iObj.style.height = iObjH.split("#")[1]+"px";
}
pseth();
</script>
</body>
</html>
跨域的那个你没测试吧
@FeiMuyu,已经在项目中使用了啊,莫非我写错了,等我从迪拜回去了,再仔细测试下。
最近一直在找这个,但都不能跨域,偶然在你这发现啦,那个高兴呀,突然看到这个”等我从迪拜回去了,再仔细测试下”有点失落,我先自己测测吧。
@aimee, 我测试过了,是可以用的,你可以下载http://www.ccvita.com/wp-content/uploads/demo/iframe/iframe.zip测试。
嗯,昨天测试用了,好像FF下不兼容,不会自动收缩
@aimee, 我测试过了,可以啊~~
我好好用了下,跨域还是有问题,在同一个域中,不加高度参数可以,但在不同域中不加高度参数会给出一个默认的不符合要求的高度,如果加高度参数什么都显示不出来,可能是那个获取高度的agent没取到
这是跨域的吗?
@ynu, 是的,是跨域的
不可跨域名
@lingfei, 在测试的时候,请将其中被iframe的页面放在其他域名下测试即可。
经测试并不跨域,有一种跨域的方法是通过访问剪切板的方式,这都不完美。
经过我的测试,楼主的方法的确是可以跨域的,但是不支持IE6呢,IE6下,仍然是不能访问的。郁闷ing,这个方法还是不完美的哦~~期待解决方法
我试过了,ie6下报错,ie8下可以,ie6下有解决办法么
跨域这个好像是不行
代码里,kimi可能路径表示不全
main.html 与 agent.html 是必须同一个域里
而iframe.html在另一个域
我在IE6里通过~~~ 感谢kimi,这个令我头疼了很久
@fshoy, 正解
很感谢,不介意转载记录下吧
经测试 跨域 在IE6,IE7下均可行
但FF3.5下有个小
BUG:当上一个页面过长时,高度无法收回
解决办法:浏览器为FF时将scrollHeight换为offsetHeight
跨域的确实不行,ie6
如果说。嵌套页面iframe.html这个页面我没有修改的权限。
现在公司要搞个访问别人链接的,我们目标页面的来源基本都是新浪,嘀咕,这种地方。
是不是无解=_=!!
@papaya, 这样的话,你可以参考比如人人网的分享页面,或者UCH的分享是如何做的
请问,agent.html是做什么用的。
我没看出它要怎么用?在哪儿调用?
能否说的详细一点,谢了。。。
有兴趣的朋友可以研究下这个站:http://www.freedns.ws/en/
无刷新网页读取信息!我把代码复制过来始终不能显示!!达不到原站的那效果!!
也不知道是怎么一回事?那位知道给个答案吧…………
被iframe的页面不能自己添加代码怎么办啊!
我是来围观的
还能更挤一点吗
我再挤!
挤死我了
@shiny, 挤挤更健康
回复留言
水水语录
树上的鸟蛋被你偷了一个吧
最新日志
分类列表
文章归档
关键词
Apache 媳妇 配置 感慨 PHP技术 MySQL Memcache 优化 PHP类 css PHP 迪拜 陈陈 调优 Linux 生活 MySQL优化 FireFox Discuz! Nginx 缓存 性能 Rewrite MooPHP框架 JavaScript WordPress插件 WordPress MySQL效率 风骚 生日 奇矩互动 负载 视频 blog程序 IE6 分析 yy 高负载 ZIP IE7 服务器 正则表达式 常用 防盗链 Cookie
Copyright © 2010 平凡的世界 Themes Design by 平凡的世界. Base on justintadlock.com.
Powered by WordPress. 19 queries. 0.177 seconds.