iframe 自适应高度(兼容目前所有主浏览器)
通过 Google 搜索 iframe 自适应高度,结果 5W 多条,搜索 iframe 高度自适应,结果 2W 多条。
我翻了前面的几十条,刨去大量的转载,有那么三五篇是原创的。而这几篇原创里面,基本上只谈到如何
自适应静的东西,就是没有考虑到 JS 操作 DOM 之后,如何做动态同步的问题。另外,在兼容性方面,
也研究的不彻底。
这篇文章,希望在这两个方面再做一些深入。
可能有人还没接触到这个问题过,先说明一下,什么是自适应高度吧。所谓 iframe 自适应高度,就是,
基于界面美观和交互的考虑,隐藏了 iframe 的 border 和 scrollbar,让人看不出它是个 iframe。如果
iframe 始终调用同一个固定高度的页面,我们直接写死 iframe 高度就可以了。而如果 iframe 要切换页面,
或者被包含页面要做 DOM 动态操作,这时候,就需要程序去同步 iframe 高度和被包含页的实际高度了。
顺便说下,iframe 在迫不得已的时候才去用,它会给前端开发带来太多的麻烦。
传统做法大致有两个:
方法一,在每个被包含页在本身内容加载完毕之后,执行 JS 取得本页面的高度,然后去同步父页面的
iframe 高度。
方法二,在主页面 iframe 的 onload 事件中执行 JS,去取得被包含页的高度内容,然后去同步高度。
在代码维护角度考虑,方法二是优于方法一的,因为方法一,每个被包含页都要去引入一段相同的代码来
做这个事情,创建了好多副本。
两个方法都只处理了静的东西,就是只在内容加载的时候执行,如果 JS 去操作 DOM 引起的高度变化,
都不太方便。
如果在主窗口做一个 Interval,不停的来获取被包含页的高度,然后做同步,是不是即方便,又解决了 JS
操作 DOM 的问题了呢?答案是肯定的。
Demo 页面:主页面 iframe_a.html ,被包含页面 iframe_b.htm 和 iframe_c.html
主页面代码示例:
<iframe id="frame_content" src="iframe_b.html" scrolling="no" frameborder="0"></iframe><script
type="text/javascript">
function reinitIframe(){
var iframe = document.getElementById("frame_content");
try{
iframe.height = iframe.contentWindow.document.documentElement.scrollHeight;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
</script>
一直执行,效率会不会有问题?