同域iframe的高度自适应

  1. 引子
  2. 父页面里控制子页面
  3. 子页面里控制父页面

一、引子

我们先看一个示例,有两个页面,1.html通过iframe嵌入2.html,两个页面都是同域的

1.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>1.html</title>
  </head>
  <body>
     <iframe id="ifr" src="2.html" frameborder="0" width="100%"></iframe>
  </body>
</html>

2.html,很多P元素将高度撑高一些

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>2.html</title>
  </head>
  <body>
     <p>这是一个ifrmae,嵌入在http://snandy.github.io/lib/iframe/1.html里 </p>
     <p>根据自身内容调整高度</p>
     <p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p>
  </body>
</html>

此时,浏览器访问1.html,效果如图

可以看到,嵌入的iframe出现了滚动条,需求是不想出现滚动条,页面多高就显示多少。我们不能随便给iframe设个高度,因为你不知道嵌入的iframe会有多高(内容是动态生成的)。

二、解决方法

解决方法其实很简单,无非是给1.html里的iframe设个高度,高度的值即为2.html的内容高度。要注意的是2.html的内容高度需要页面完全载入(onload)后获取。

有两种方式

A. JS代码写在父页面,即父页面(1.html)里获取子页面(2.html)文档对象,当iframe载入后(load)获取高度,将此高度值赋值给iframe标签

开始测试时使用iframe的contentWindow的load事件,但所有浏览器均不执行。最后使用iframe的load事件,在父页面1.html底部加入如下JS代码

<script type="text/javascript">
  // 计算页面的实际高度,iframe自适应会用到
  function calcPageHeight(doc) {
      var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
      var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
      var height  = Math.max(cHeight, sHeight)
      return height
  }
  var ifr = document.getElementById("ifr")
  ifr.onload = function() {
      var iDoc = ifr.contentDocument  ifr.document
      var height = calcPageHeight(iDoc)
      ifr.style.height = height + "px"
  }
</script>

这里有几个细节:

1. 取iframe内的文档对象,标准浏览器使用contentDocument属性,IE低版本(IE6,7,8)使用document属性。

2. calcPageHeight函数计算页面的实际高度,标准浏览器使用document.documentElement,低版本IE使用 document.body,默认取clientHeight,出现滚动条的取scrollHeight,最后取两个值中最大的。

B. JS代码写在子页面,即子页面在window load后计算高度,将此高度值赋值给父页面的iframe

在子页面(2.html)底部加入如下代码

<script>
    // 计算页面的实际高度,iframe自适应会用到
    function calcPageHeight(doc) {
        var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
        var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
        var height  = Math.max(cHeight, sHeight)
        return height
    }
    window.onload = function() {
        var height = calcPageHeight(document)
        parent.document.getElementById("ifr").style.height = height + "px"    
    }
</script>

通过这两种方式都可以实现iframe的高度自适应,可以看到重新设置iframe的高度后,其滚动条都去掉了。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索html
, iframe
, 页面
, 异域怎么取 iframe
, document
, 高度
, iframe载入数据问题
, iframe 嵌套 子页面
, ,滚动条,iframe,web
, height
, 获取页面高度
, iframe滚动条
, 页面高度
iframe高度
iframe 自适应高度、iframe动态自适应高度、iframe自适应内容高度、设置iframe高度自适应、iframe自适应宽度高度,以便于您获取更多的相关知识。

时间: 2024-11-05 14:58:50

同域iframe的高度自适应的相关文章

跨域iframe的高度自适应

原文:跨域iframe的高度自适应   跨子域的iframe高度自适应 完全跨域的iframe高度自适应   同域的我们可以轻松的做到 1. 父页面通过iframe的contentDocument或document属性访问到文档对象,进而可以取得页面的高度,通过此高度值赋值给iframe tag. 2. 子页面可以通过parent访问到父页面里引入的iframe tag,进而设置其高度.   但跨域的情况则不允许对子页面或父页面的文档进行访问(返回undefined),所以我们要做的就是打通或间

iframe窗口高度自适应的实现方法

 这篇文章主要介绍了iframe窗口高度自适应的实现方法,有需要的朋友可以参考一下 domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html 由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少,现在需要去掉iframe的滚动条 由于javascript同源策略的限制,无法进行跨域操作,使得问题比较棘手 参考了一下网上的做法,引入了一个代理页面,或者叫做中介 agent.html,属于domainA 然后

iframe窗口高度自适应的又一个巧妙实现思路

 这篇文章主要介绍了实现iframe窗口高度自适应的又一个巧妙思路,需要的朋友可以参考下 domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html  由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少,现在需要去掉iframe的滚动条  由于javascript同源策略的限制,无法进行跨域操作,使得问题比较棘手  参考了一下网上的做法,引入了一个代理页面,或者叫做中介 agent.html,属于doma

JQuery实现跨域IFrame自动高度方案

由于项目中引入了JQuery,不方便再引用YUI.所以依照 Session variables without cookies 原理 ,直接用JQuery实现如下: 场景:主页面 (emo_windowname.html)一个IFrame(framePreview), 在页面加载或者单击按钮时,让IFrame加载一个页面(http://...../正文.html). 条件:正 文.html 预告加入脚本,或者使用HttpModule加入脚本: $(function(){ window.name

Bootstrap+iframe+sbadmin2高度自适应后台管理系统模板

基于Bootstrap框架的后台管理模板是越来越多了.以前说的有ace,sb admin2.Metronic等等.详见本文最后的参考资料. 其中,涉及到iframe的好像没有讲到,今天分享一下Bootstrap+iframe+sbadmin2高度自适应后台管理系统模板. 首先sb admin2 我就不介绍这个叫做傻逼的后台模板了,大家可以详见:[基于Bootstrap 的简约美观的后台管理系统模板UI:SB Admin 2] 先看效果图: 预览demo:Bootstrap+iframe后台管理系

Iframe框架高度自适应的实现

自适应 解决iframe框架页面自适应高度问题代码如下,需要注意的是框架引用页面一定要设置name属性,否则会不生效 方案一: <iframe src="test.asp" width="100%" frameborder="0" scrolling="no" name="hj" id="hj"></iframe> test.asp页面head间增加如下JS代码

iframe窗口高度自适应的又一个巧妙实现思路_javascript技巧

domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html 由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少,现在需要去掉iframe的滚动条 由于javascript同源策略的限制,无法进行跨域操作,使得问题比较棘手 参考了一下网上的做法,引入了一个代理页面,或者叫做中介 agent.html,属于domainA 然后,在domainB 中的other.html中,再使用iframe将agent.ht

iframe窗口高度自适应的实现方法_javascript技巧

domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少,现在需要去掉iframe的滚动条由于javascript同源策略的限制,无法进行跨域操作,使得问题比较棘手参考了一下网上的做法,引入了一个代理页面,或者叫做中介 agent.html,属于domainA然后,在domainB 中的other.html中,再使用iframe将agent.html进行

file模式访问网页时iframe高度自适应解决方案_javascript技巧

最近做到iframe的高度自适应这个问题,网上一搜好多解决方案,而总结起来也就那几种,我逐一尝试这些方案,最后发现在我的项目中都不起作用,后来发现自己做的网页是通过file方式访问的,将网页代码放到apache下通过http协议访问,在iframe加载的时候调用如下js方法: 复制代码 代码如下: <SPANstyle="FONT-FAMILY:KaiTi_GB2312;FONT-SIZE:18px">functionSetWinHeight(obj) { varwin=o