meizz的专栏

梅花雪·疏影横斜

原创 JavaScript应用:Iframe自适应其加载的内容高度收藏

新一篇: XHTML:非IE浏览器里对style.height赋值无效的问题 | 旧一篇: 梅花雪脚本控件集:MzPopupLayer 可盖住flash的层基类

main.htm:

<html>  
    
<head>  
       
<meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' />  
       
<meta  name='author'  content='F.R.Huang(meizz梅花雪)//www.meizz.com' />  
       
<title>iframe自适应加载的页面高度</title>  
    
</head>  
     
    
<body>
        
<div><iframe src="child.htm"></iframe></div>
    
</body>
</html>

child.htm:

 

<html>  
<head>  
    
<meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' />  
    
<meta  name='author'  content='F.R.Huang(meizz梅花雪)//www.meizz.com' />  
    
<title>iframe  自适应其加载的网页(多浏览器兼容)</title>  
    
<script type="text/javascript">
    
<!--
    
function iframeAutoFit()
    
{
        
try
        
{
            
if(window!=parent)
            
{
                
var a = parent.document.getElementsByTagName("IFRAME");
                
for(var i=0; i<a.length; i++//author:meizz
                {
                    
if(a[i].contentWindow==window)
                    
{
                        
var h1=0, h2=0, d=document, dd=d.documentElement;
                        a[i].parentNode.style.height 
= a[i].offsetHeight +"px";
                        a[i].style.height 
= "10px";

                        
if(dd && dd.scrollHeight) h1=dd.scrollHeight;
                        
if(d.body) h2=d.body.scrollHeight;
                        
var h=Math.max(h1, h2);

                        
if(document.all) {h += 4;}
                        
if(window.opera) {h += 1;}
                        a[i].style.height 
= a[i].parentNode.style.height = h +"px";
                    }

                }

            }

        }

        
catch (ex){}
    }

    
if(window.attachEvent)
    
{
        window.attachEvent(
"onload",  iframeAutoFit);
        
//window.attachEvent("onresize",  iframeAutoFit);
    }

    
else if(window.addEventListener)
    
{
        window.addEventListener(
'load',  iframeAutoFit,  false);
        
//window.addEventListener('resize',  iframeAutoFit,  false);
    }

    
//-->
    
</script>  
</head>  
<body>
    
<table border="1" width="200" style="height: 400px; background-color: yellow">
        
<tr>
            
<td>iframe  自适应其加载的网页(多浏览器兼容:IE5.5+、Mozilla、Firefox、Opera、Netscape7.2+、Safari3等,支持XHTML)</td>
        
</tr>
    
</table>
</body>  
</html>

  很多人反应在IE7里使用它会死机,那是因为在自适应高度时触发了 window.onresize 事件,而这个事件又去调用这个调整 <iframe> 高度的函数,产生了死循环调用。

  这段代码里我对 iframe 所在的父元素也设定了一个高度,以防止iframe 高度变化时页面跳动的太厉害,在调用的时候可酌情使用这个设置。

发表于 @ 2006年03月27日 11:07:00|评论(loading...)|编辑

新一篇: XHTML:非IE浏览器里对style.height赋值无效的问题 | 旧一篇: 梅花雪脚本控件集:MzPopupLayer 可盖住flash的层基类

评论

#frjcy 发表于2006-03-27 23:42:00  IP: 211.100.21.*
TrackBack来自《JavaScript应用:Iframe自适应其加载的内容高度 》

JavaScript应用:Iframe自适应其加载的内容高度
#frjcy 发表于2006-03-27 23:45:00  IP: 211.100.21.*
TrackBack来自《JavaScript应用:Iframe自适应其加载的内容高度 》

JavaScript应用:Iframe自适应其加载的内容高度
#meizz 发表于2006-03-28 15:58:00  IP: 218.247.0.*
这个没有办法,因为只有在 onload 之后才能最终确定被加载的页面的准确高度。
#supNate 发表于2006-03-28 15:16:00  IP: 218.94.38.*
实现不错,但总归要等onload以后才能工作,显得不够完美
#xosharp 发表于2006-03-28 18:14:00  IP: 221.222.10.*
有AJAX了,为什么还要用iframe
#fish119 发表于2006-03-29 09:55:00  IP: 220.192.233.*
顶楼上的,如果用iframe,只能在onload之后才能进行高度判断,不如ajax来得直接了
#fish119 发表于2006-03-29 09:55:00  IP: 220.192.233.*
顶楼上的,如果用iframe,只能在onload之后才能进行高度判断,不如ajax来得直接了
#11 发表于2006-03-29 16:21:00  IP: 218.108.47.*
不能用
#nickey 发表于2006-03-30 18:28:00  IP: 203.95.110.*
有什么理由不用ajax么? 为什么要iframe自动适应? 我直接request一个内容过来,然后填到一个div或者table, 自动扩展不好么? 干嘛要写这么麻烦的代码?
#meizz 发表于2006-03-30 17:42:00  IP: 218.247.0.*
不要什么都用 AJAX,AJAX又不是万金油擦哪哪亮!什么样的技术最适合当前的需求就应该使用哪种技术。
#ltjabc 发表于2006-03-31 09:25:00  IP: 218.108.47.*
我有个动态网页要 放到ifame,这个ifame在一个div里...由于动态网页的内容未知.怎么做才能让ifame,div根据网页大小来调整高度和宽度.目的是使scrollbar不出来
#zenyivon 发表于2006-03-31 09:13:00  IP:
支持 meizz。
#josua 发表于2006-04-04 13:29:00  IP: 61.183.66.*
ajax要服务器支持的,没服务器支持的时候呢?
#LuckySun 发表于2006-04-05 21:41:00  IP: 61.53.92.*
其实"啊甲刻丝"也好,"一副瑞木"也好,"外不二点零也好"也好,都是种技术,实现客户需求,赚来钱就是最好了,呵呵!支持楼主.
#FEB15 发表于2006-04-06 15:27:00  IP: 210.22.26.*
同意 meizz 的观点,不要什么都用AJAX。

我已经尝试过了 在一个B/S里用 AJAX 编码难度比以前增加若干,调试派错难度也大,怎个就一个效率低。

meizz,我是直接在 iframe 页的 <Body onLoad="parent.document.all.父页的单元格.height=this.document.body.scrollHeight+0;">

现在发现只要 iframe的html不健全就会 失效。
#第六世纪 发表于2006-04-09 18:53:00  IP: 221.218.165.*
宽度不行耶.
#pwqzc 发表于2006-04-09 22:21:00  IP: 222.242.112.*
支持梅花
强烈支持
我已经尝试过了 在99收藏夹http://www.99scj.com里用 AJAX 编码难度比以前增加若干,怎个就一个效率低
#lyp 发表于2006-04-13 14:21:00  IP: 172.24.192.*
如果iframe里面的页面来自其他系统的页面,如何解决!!!!
#dawave 发表于2006-04-17 08:57:00  IP: 216.58.17.*
下面的代码在IE和FireFox中测试通过:

<iframe name="frame1" src="..." onload="this.height=window.frames[this.name].document.body.scrollHeight;">
#meizz 发表于2006-04-18 16:47:00  IP: 218.247.0.*
回复楼上的兄弟,你这只是对 iframe 的原装页面起效,对于在 iframe 链接跳转的页面还有效吗? iframe 标签的 onload 事件在低版本里能起效吗?
#FEB15 发表于2006-04-20 17:33:00  IP: 210.22.26.*
跳转的话只能在跳转到的页内

<Body onLoad="parent.document.all.父页的iframe.height=this.document.body.scrollHeight;">
#imqq 发表于2006-04-22 10:24:00  IP: 220.184.72.*
一运行CPU 占用率100%哦
#zhailj 发表于2006-04-25 10:19:00  IP: 60.191.25.*
呵呵,梅花,第一次来你的BLOG,顶一下!
#cm4ever 发表于2006-04-26 23:02:00  IP: 219.136.219.*
一不小心看到此文。
有意思,和我用同样的函数名。
不过我的函数只兼容IE,你的代码很有帮助,谢谢。
#imqq 发表于2006-04-27 13:27:00  IP: 220.184.76.*
你的代码一运行CPU 占用率100%哦,为什么啊
#ppluncle 发表于2006-04-29 16:48:00  IP: 61.187.248.*
to meizz:
我测试运行您的代码,也出现了imqq 同样的问题,CPU占用率100%,我的系统是Windows xp sp2
#123 发表于2006-05-01 14:59:00  IP: 58.34.2.*
确实发现里面有类似锁死的问题,

例如:

在调整了第1个页的高度以后,如果继续使用,就出现第2个页面的与第1个页相同。

第3个页在加载就会锁死!
#losingrose 发表于2006-05-04 23:41:00  IP: 202.115.138.*
ajax同步读取的话会产生死锁,异步的话可能会使用户摸不着头脑,js的系统处理开发过程是非常艰难的,简单的处理虽然不是很麻烦,但是会带来不少附带问题,如果有必要推崇ajax的话,不如直接支持JSVM,这个外国已经有公司在搞了,似乎并没有很引人注意。
#zzz 发表于2006-05-08 13:30:00  IP: 61.174.177.*
用IE7卡死...
#weekzero 发表于2006-05-12 08:53:00  IP: 60.209.248.*
支持meizz,这个是很有用的,很多时候客户就需要这个效果
#夕阳 发表于2006-05-15 16:33:00  IP: 218.4.149.*
什么逻辑啊,用ajax效率低那不是ajax的问题,而是开发和设计的问题,ajax是不能乱用,可是也不能因为用的人多而就特立独行的抵制。。还有什么用户莫不桌头脑这些问题,也提出来?你们难道认为这些事ajax的问题?本身ajax,iframe都是一个实现手段,而你们这些问题明显就不是技术问题,而是设计问题
#ice 发表于2006-05-16 09:52:00  IP: 221.11.28.*
addEventListener 中的第三个参数是什么意思?
#jhyc 发表于2006-05-17 10:02:00  IP: 61.177.149.*
差点没把我机器搞死,这做病毒合适阿:(
#fuuu 发表于2006-05-19 09:39:00  IP: 61.52.0.*
确实是100%
#stangray 发表于2006-05-19 23:30:00  IP: 218.79.108.*
在JavaScript中調用webservice.htc的那個文件。來實現頁面調用的方法叫什麼呢?
#风在雨里 发表于2006-05-24 14:17:00  IP: 220.231.23.*
windows server 2003 sp1
ie6.0 sp1
锁死。。
#风在雨里 发表于2006-05-24 14:27:00  IP: 220.231.23.*
检查之后,把这句后面的单位注释掉,问题好像不出现了。
具体原因不是很理解。
a[i].style.height = h;// +"px";
#风在雨里 发表于2006-05-24 14:32:00  IP: 220.231.23.*
但是网页不能刷新。把这两句都注释掉。问题解决。。
// window.attachEvent("onresize", iframeAutoFit);
// window.addEventListener('resize', iframeAutoFit, false);
#小胖 发表于2006-05-26 14:04:00  IP: 218.249.5.*
我试了,但是容易死机
#cbzdream 发表于2006-06-05 14:12:00  IP: 202.127.112.*
document.body.scrollHeight的值有时候等于0,不知道为什么,

// window.attachEvent("onresize", iframeAutoFit);
// window.addEventListener('resize', iframeAutoFit, false);

必须去掉上面2句,要不然就ie就死了.
#ding518 发表于2006-06-05 21:52:00  IP: 61.149.169.*
容易死机呀。
#zkjbeyond 发表于2006-06-18 16:05:00  IP: 219.82.237.*
window.attachEvent("onresize", iframeAutoFit);
window.addEventListener('resize', iframeAutoFit, false);

需要remove的

#zzxop 发表于2006-06-25 19:27:00  IP: 221.1.68.*
好东东,谢谢!
#siophy 发表于2006-06-26 13:31:00  IP: 218.249.8.*
梅大侠,请问如何得到系统变量
%TEMP%的值?谢谢啊
#csdncb 发表于2006-06-26 20:35:00  IP: 221.216.201.*
我觉得这样也行,(可用,但不好用):

在服务器中根据具体的页面内容(设计时确定),确定加载的的指定iframe的高度和宽度:
aspx中示意如下:
<iframe src="x.htm" width=<%iWith%> height=<%=iHeight%>></iframe>

欢迎进一步交流:bingcaicai@sina.com
#メ冰枫ぱ雪 发表于2006-06-27 01:23:00  IP: 220.160.64.*
现在努力学Ajax,不过这个也很赞,顶个先。
# 发表于2006-07-06 17:04:00  IP: 220.167.29.*
如果是其他域名下的地址就不能操作了,楼主有没有更好的办法来解决这个问题呢?
#虾米 发表于2006-07-07 05:26:00  IP: 210.41.86.*
梅老大,这个代码在UTF-8页面不行么??
#酷网吧! 发表于2006-07-16 21:58:00  IP: 60.190.130.*
下面这段一定行
iframe 自适应高度 js实现

代码如下:

注意!不能跨域使用,传到服务器,或者自己的iis里运行iframe 本域页面.~~

引用

<iframe src="http://www.pcieee.cn/" style="width: 100% ; border: 0px" frameborder=0 scrolling=yes name=right onload="init()" border="0"></iframe>

<script>

var lastHeight;

function init() {

aaa();

lastHeight= right.document.body.scrollHeight;

setInterval(function(){

if(right.document.body.scrollHeight!=lastHeight) {

aaa();

lastHeight= right.document.body.scrollHeight;

}

},1);

}

function aaa(){

document.all('right').height=right.document.body.scrollHeight + 20;

}


</script>


www.k900.cn
#酷网吧! 发表于2006-07-16 22:00:00  IP: 60.190.130.*
下面这段一定行
iframe 自适应高度 js实现

代码如下:

注意!不能跨域使用,传到服务器,或者自己的iis里运行iframe 本域页面.~~

引用

<iframe src="http://www.k900.cn /" style="width: 100% ; border: 0px" frameborder=0 scrolling=yes name=right onload="init()" border="0"></iframe>

<script>

var lastHeight;

function init() {

aaa();

lastHeight= right.document.body.scrollHeight;

setInterval(function(){

if(right.document.body.scrollHeight!=lastHeight) {

aaa();

lastHeight= right.document.body.scrollHeight;

}

},1);

}

function aaa(){

document.all('right').height=right.document.body.scrollHeight + 20;

}


</script>




#amao 发表于2006-07-27 17:30:00  IP: 220.163.35.*
真的不如用ajax
#hujunhua(10646337) 发表于2006-09-18 23:44:00  IP: 222.216.144.*
说"不如用aJAX"的人真是无知!!!

有的人很肤浅! 你真以为有AJAX就可以不要frame了吗?

其实ajax 和 IFRAME 根本就没有可比性! 你就好比是把
汽车和 四轮驱动技术 做比较! 能比较吗???


就拿最普通WEB应用OA 你的主框架不用IFRAME 或者frame

而用ajax 那么你的一个页面上业务逻辑可能异常的多和复杂!

而使用了iframe 或者 frame 方式 这样可以让 不同的页面实现不同的业务逻辑 程序清晰 又容易维护!

另外 由楼主的这段代码 使我想到了一个很值得我们思考的问题!

就是在实现每一个功能的时候 尽量多想想有没有比这更容易的方法,是否系统把我要实现的方法内置了, 这样可以少走些弯路! 使程序更清洁!


另外 dawave 的方法不错!我以前也是这么用的! 比起楼主的一堆JAVASCRIPT要好多了! 梅花雪兄弟搞JAVASCRIPT 是搞走火入磨了 哈哈!!!
#美洲豹 发表于2006-11-08 20:09:00  IP: 222.66.33.*
IE7 下,scrollHeight 得到的是错误的..怎么解决啊
本来我用
<script>
function init(){
document.getElementById("oMain").height=window.frames["oMain"].document.body.scrollHeight;
}
</script>
<iframe onload="init()" id="oMain" name="oMain" width="100%" height="1000" src="<?=$url?>" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>


但这在IE下使用,scrollHeight得到的不到100,,抓狂,要适应IE7有没有替代的方法啊?
#美洲豹 发表于2006-11-08 20:10:00  IP: 222.66.33.*
IE7 下,scrollHeight 得到的是错误的..怎么解决啊
本来我用
<script>
function init(){
document.getElementById("oMain").height=window.frames["oMain"].document.body.scrollHeight;
}
</script>
<iframe onload="init()" id="oMain" name="oMain" width="100%" height="1000" src="<?=$url?>" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>


但这在IE下使用,scrollHeight得到的不到100,,抓狂,要适应IE7有没有替代的方法啊?
#美洲豹 发表于2006-11-08 20:11:00  IP: 222.66.33.*
IE7 下,scrollHeight 得到的是错误的..怎么解决啊
本来我用
<script>
function init(){
document.getElementById("oMain").height=window.frames["oMain"].document.body.scrollHeight;
}
</script>
<iframe onload="init()" id="oMain" name="oMain" width="100%" height="1000" src="<?=$url?>" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>


但这在IE下使用,scrollHeight得到的不到100,,抓狂,要适应IE7有没有替代的方法啊?
#美洲豹 发表于2006-11-08 20:12:00  IP: 222.66.33.*
IE7 下,scrollHeight 得到的是错误的..怎么解决啊
本来我用
<script>
function init(){
document.getElementById("oMain").height=window.frames["oMain"].document.body.scrollHeight;
}
</script>
<iframe onload="init()" id="oMain" name="oMain" width="100%" height="1000" src="<?=$url?>" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>


但这在IE下使用,scrollHeight得到的不到100,,抓狂,要适应IE7有没有替代的方法啊?
#美洲豹 发表于2006-11-08 20:12:00  IP: 222.66.33.*
晕,怎么提交了这么多...
#daluoboequalto 发表于2007-01-05 15:35:24  IP: 219.238.121.*
技术,和应用,不是一回事。

即使ajax,已经是集成了web ui上所有的完美方案,能排除扼杀其它的一切,那么,研究研究一些东西,写点ajax以外的东西,还是对自己有益的——也可以当作娱乐。
而ajax自身,也是在发展中的,它也是程序员写出来的,不是天上掉下来的。
——给一些蠢材一点教训:大米,是农民伯伯在稻田里种出来的,不是直接从米袋或者饭锅里倒出来的;衣服,是工厂里生产的,不是商场里本来就有的;电脑,也是人类生产的,不是上帝或者圣诞老人直接将它摆在了你这个蠢材的桌子上 ……

很BS那些叫嚣着ajax的人们,ajax是用来解决问题的工具,不是给你们这些白痴举着来遮掩自己的无知和愚昧的大旗。
#zilu2008 发表于2007-01-16 23:44:42  IP: 60.176.149.*
好文 好评论
我转到自己的BLOG了
慢慢学习
#andywang1 发表于2007-07-23 10:58:34  IP: 218.19.123.*
晕死,怎么调用呀,怎么没有用呀。
#andywang1 发表于2007-07-23 11:10:24  IP: 218.19.123.*
救命,解决不了实际问题,如下:
1、左边的iframe会自动在上面留下空白,不能靠顶。
#andywang1 发表于2007-07-23 11:18:47  IP: 218.19.123.*
还有右边的iframe的滚动条不能用。救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命救命
#andywang1 发表于2007-07-23 11:22:33  IP: 218.19.123.*
为什么asp.net比asp越来越不好用?为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么为什么
#cxlcxl1234leader 发表于2007-12-18 14:08:00  IP: 211.138.9.*
<body topmargin="0" leftmargin="0">
1、左边的iframe会自动在上面留下空白,不能靠顶。
不知道你是不是找这个
编程中 .net www.coding123.net


#cxlcxl1234leader 发表于2007-12-18 14:09:37  IP: 211.138.9.*
1、左边的iframe会自动在上面留下空白,不能靠顶。
<body topmargin="0",leftmargin="0">
编程中 www.coding123.net
#rain_cn 发表于2007-12-31 22:01:50  IP: 218.58.70.*
java综合网
http://www.javazh.cn
不错,不错
#turnerguo 发表于2008-05-22 00:36:04  IP: 58.31.115.*
实际问题实际对待,无论ajax、js、iframe...都是一种解决问题的方案,懂得灵活应用才是关键。
我觉得文章写得很不错,楼主只不过讲了一种实现方法,并没有说是标准。
代码很规范,符合W3C标准,支持多浏览器...这就是可取之处!
#lingdu_hua 发表于2008-06-16 11:59:13  IP: 219.239.110.*
iframe是框架页.不是什么TABLE就可以替代的.
说用AJAX的看来都是只会做点ASP网站的吧...
onload="this.height=this.contentWindow.document.body.scrollHeight;"
我用这个来自适应
#zhejiangshan 发表于2008-07-15 14:22:36  IP: 60.176.212.*
杭州百度代理商杭州百度包年杭州网络推广杭州网站推广搜索引擎优化杭州网站优化杭州网站改版杭州google优化杭州SEO杭州网站建设建德网站建设杭州网站改版富阳网站建设临安网站建设网站推广搜索引擎网站优化网站改版google优化SEO</li>
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © meizz