使用iframe加载其他页面的时候,需要自适应iframe的高度

这里加载了两个不同内容高度的页面至iframe中

1. 没有设置高度

      <div class="iframe-wrapper">
<iframe name="iframe1" src="iframe1.html" frameborder="0" width="100%"></iframe>
<iframe name="iframe2" src="iframe2.html" frameborder="0" width="100%"></iframe>
</div>

默认长这样

有滚动条,可以看到iframe并不会因为内容高度自动撑开

2. 显示地设置高度

        <div class="iframe-wrapper">
<iframe name="iframe1" src="iframe1.html" frameborder="0" width="100%" height="300px"></iframe>
<iframe name="iframe2" src="iframe2.html" frameborder="0" width="100%" height="300px"></iframe>
</div>

内容长这样,但可以看到,高度定死了,没有自适应

3. 在onload事件触发时,根据body的高度自适应iframe的高度

        <div class="iframe-wrapper">
<iframe name="iframe1" onload="this.height=this.contentWindow.document.body.scrollHeight" src="iframe1.html" frameborder="0" width="100%"></iframe>
<iframe name="iframe2" onload="this.height=iframe2.document.body.scrollHeight" src="iframe2.html" frameborder="0" width="100%"></iframe>
</div>

注意到这里的 this.contentWindow 其实就类似与下方的 name值对应的iframe2,两种引用方式是等价的

可以发现,高度虽然能自适应,不过只支持高度了“从小到大”的自适应

如iframe2的内容比iframe1的高,后者动态加载出前者能自适应,但前者动态加载出后者就不行了,这种高度减小不了

最后的解决办法是

4. 在onload事件中动态设置高度为body高度之前,先将原高度还原为auto或空值

可以用setTimeout(fn,0)将高度设置放到下一轮事件循环中执行,或者在 onbeforeunload 事件中先把高度设置为auto

setTimeout

      var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
// 放在闭包中,防止iframe触发load事件的时候下标不匹配
(function(_i) {
iframes[_i].onload = function() {
// 提前还原高度
this.setAttribute('height', 'auto'); // 或设为''
// 再在下一轮事件循环中设置新高度
setTimeout(function() {
iframes[_i].setAttribute('height', iframes[_i].contentWindow.document.body.scrollHeight);
}, 0);
}
})(i);
}

onbeforeunload

        var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
// 放在闭包中,防止iframe触发load事件的时候下标不匹配
(function(_i) {
iframes[_i].onload = function() {
this.contentWindow.onbeforeunload = function() {
iframes[_i].setAttribute('height', 'auto');
}; this.setAttribute('height', this.contentWindow.document.body.scrollHeight);
};
})(i);
}

基本ok了,不过偶尔(可能是电脑卡了?)会看到些抖动闪动的情况

5. 要避免这个情况,可暂时将它隐藏

先设置display为none,再设置为block;或者先设置visibility为hidden,再设置为visible 。 用visibility看起来变化地更自然一点

setTimeout

       var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
// 放在闭包中,防止iframe触发load事件的时候下标不匹配
(function(_i) {
iframes[_i].onload = function() {
this.style.visibility = 'hidden';
// this.style.display = 'none'; // 提前还原高度
this.setAttribute('height', 'auto'); // 或设为'' // 再在下一轮事件循环中设置新高度
setTimeout(function() {
iframes[_i].setAttribute('height', iframes[_i].contentWindow.document.body.scrollHeight); iframes[_i].style.visibility = 'visible';
// iframes[_i].style.display = 'block';
}, 0);
}
})(i);
}

onbeforeunload

        var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
// 放在闭包中,防止iframe触发load事件的时候下标不匹配
(function(_i) {
iframes[_i].onload = function() {
this.contentWindow.onbeforeunload = function() {
iframes[_i].style.visibility = 'hidden';
// iframes[_i].style.display = 'none'; iframes[_i].setAttribute('height', 'auto');
}; this.setAttribute('height', this.contentWindow.document.body.scrollHeight); this.style.visibility = 'visible';
// this.style.display = 'block';
};
})(i);
}

让动态的 iframe 内容高度自适应的更多相关文章

  1. iframe的高度自适应

    http://www.cnblogs.com/snandy/p/3902337.html http://www.cnblogs.com/snandy/p/3900016.html Snandy Sto ...

  2. 同域iframe的高度自适应

    引子 父页面里控制子页面 子页面里控制父页面 一.引子 我们先看一个示例,有两个页面,1.html通过iframe嵌入2.html,两个页面都是同域的 1.html <!DOCTYPE html ...

  3. 跨域iframe的高度自适应

    If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ...

  4. 动态替换iframe的src及动态改变iframe的高度

    实现效果:点击左侧右侧内容变化,但左侧保持不变(如折叠等) 动态替换iframe的src <iframe width="100%" frameBorder="0&q ...

  5. JQuery iframe宽高度自适应浏览器窗口大小的解决方法

    iframe宽高度自适应浏览器窗口大小的解决方法   by:授客 QQ:1033553122 1.   测试环境 JQuery-3.2.1.min.js 下载地址: https://gitee.com ...

  6. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  7. js动态改变iframe的高度

    js动态改变iframe的高度的写法 〈iframe id="docDetail" width="100%"  height="200"   ...

  8. 页面嵌套iframe时,怎样让iframe高度根据自身内容高度自适应

    总体思路是这样的,因为iframe里页面的内容是动态加载的,而且电脑屏幕宽度发生变化时,也得相应的去改变iframe标签的高度(如果高度确定就不用这么麻烦了): 首先,我们在父页面中定义一个方法,用来 ...

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

    domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少 ...

随机推荐

  1. 使用 Productivity Power Tools 2013来帮助你提高 VS2013的工作效率

    Visual Studio Gallery中发布了Productivity Power Tools 2013 的更新.在此版本中,此版本解决了客户报告的大量错误和问题,并介绍了一项称为语法行压缩的新功 ...

  2. 剑指Offer面试题:35.将字符串转换为数字

    一.题目:将字符串转换为数字 题目:写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不能使用atoi或者其他类似的库函数. 二.代码实现 (1)考虑输入的字符串是否是NULL.空字符 ...

  3. 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  4. 说说SQL Server 网络配置

    打开Sql Server Configuration Manager,里面显示了SQL Server的网络配置,这些到底表示什么含义呢? 图一:MSSQLSERVER的协议 这些配置选项,其实就是为了 ...

  5. shell日常案例(一)

      序   在linux平台下开发,我们经常会接触到一些任务性质的工作,而处理方式多样化.现积累各个案例.   清理近7天的数据   日志文件越来越大,我们需要及时的去做清理工作.配合工具:find, ...

  6. Redis 发布订阅用法

    一.发布订阅模型发布订阅其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方. 发送方:只负责向第三方发送消息.(杂志社把读者杂志交给邮局)接 ...

  7. MySQL_02之增删改查、PHP数据库操作

    1.数据操作: ①插入记录:  插入单条记录:INSERT tbl_name(字段名称,--) VALUES(字段值,--);  插入多条记录:INSERT tbl_name(字段名称,--) VAL ...

  8. 复习sql第三次

    1.层次型数据库以"树"结构表示数据库中数据间的关系:网状型以"图"结构表示数据库中数据间的关系:关系型数据库以"二维表"结构表示数据库中数 ...

  9. Maven Plugins常用配置

    官方文档:http://maven.apache.org/plugins/index.html# 这里主要介绍compiler插件的配置.http://maven.apache.org/plugins ...

  10. ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章

    上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据.   目录: ASP.N ...