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


Posted in Javascript onJanuary 08, 2014

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

好了,现在情况是这样的:
index.html 使用iframe 嵌套 other.html
other.html 使用iframe 嵌套 agent.html
之所以要引入第3个页面agent.html,就是为了遵守“同源策略”的规则,完成不同domain下参数的传递!

我们最终的目的是要去掉滚动条,又要保证被嵌入的页面内容全部得到显示
1.取得other.html页面的实际高度height
2.将height设置到其嵌入的iframe的src属性上
3.在agent.html中截取出所属iframe的src属性中的height值

下面的例子中,使用了一个技巧,避免了使用setInterval()不断去设置iframe的高度
做法是在iframe的src上,附加一个时间戳,让浏览器每次都重新加载agent.html
进而让agent.hml中的js函数invokeMethodInTopWindow()得到执行
domainA 中的2个html
index.html

#{extends 'main.html' /}
#{set title:'Home' /}
<hr>
<div style="color:red;font-weight:bold">窗口自适应---绕开同源策略的限制,同时又利用同源策略,去掉iframe的滚动条,动态调整窗口的高度,让其能够显示被嵌套页面的所有内容</div>
<!-- 需要动态调整高度的iframe -->
<div style="text-align:center;">
    <iframe name="domainB" src="http://127.0.0.1:8088/other" width="80%" scrolling="no" frameborder="0"></iframe>
</div>
<script type="text/javascript">
    function resize(height) {
        //alert("resize");
        document.getElementsByName("domainB")[0].height=height;
    }
</script>

agent.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    我是代理页面哦!
<script type="text/javascript">
    window.onload = invokeMethodInTopWindow; 
    function invokeMethodInTopWindow() {
        //alert("调用同域下的函数,重置iframe的高度");
        var domainA = document.parentWindow;
        var realHeight = domainA.location.hash.split("#")[1];
        //last step:调用最上层窗口的函数,重置iframe的高度 
        parent.parent.resize(realHeight);
        //alert("realHeight:"+realHeight);
        //alert(document.parentWindow.name);//获取容器所在窗口的名称 domainA
        //error://alert(document.parentWindow.parent.name); //访问失败 :不能访问domainB 
        //alert(document.parentWindow.parent.parent.name);//最顶层window属于domainA,因此可以访问
    }
    //使用不同的时间戳设置iframe的src属性后,就不用使用setInterval()
    //setInterval("invokeMethodInTopWindow()",100);
</script>
</body>
</html>

domainB中的other.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body onclick="proxy()">
    <!-- 被A域所嵌入的页面 -->
    <button type="button" onclick="btnClick()">切换显示</button>    <div style="display:none">
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
        在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
        这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
        所谓同源是指,域名,协议,端口相同。
    </div>
    <div style="display:block">
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
        比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
        他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
    </div>
    <!-- 反向嵌入A域的页面 -->
    <iframe name="domainA" src="" style="display:none"></iframe>
    <!-- script -->
    <script type="text/javascript">
        //隐藏或显示div
        function btnClick() {
            var div = document.getElementsByTagName("div");
            for(var i in div) {
                if(i<div.length)                
                    div[i].style.display = (div[i].style.display == 'none') ? "block" : "none";
            }
        }
    </script>
    <script type="text/javascript">
        function proxy(){
            //alert("btn click");
            //获取本页面的高度 
            var scrollHeight = document.documentElement.scrollHeight;
            //alert("滚动条高度:"+scrollHeight);
            //将窗口的高度先设置到属于domainA的iframe的src属性上 
            var iframeDomainA = document.getElementsByName("domainA")[0];
            //用domainA的一个页面作为代理,最终的目的是解决“同源策略”的限制  
            var url = "http://localhost:9000/agent";
            /**技巧:通过时间戳让浏览器每次重新加载iframe,这样每次都会自动设置被嵌套的iframe的高度,避免了使用setInterval()*/
            iframeDomainA.src = url+ "? time=" + new Date().getTime() + "#" + scrollHeight ;
        }
        window.onload = proxy;
    </script>
</body>
</html>
Javascript 相关文章推荐
jQuery asp.net 用json格式返回自定义对象
Apr 07 Javascript
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
javascript学习笔记之函数定义
Jun 25 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
Apr 12 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
Aug 09 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
layui操作列按钮个数和文字颜色的判断实例
Sep 11 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 Javascript
jquery对单选框,多选框,文本框等常见操作小结
Jan 08 #Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
Jan 08 #Javascript
js获取当前页面路径示例讲解
Jan 08 #Javascript
js获取当前路径的简单示例代码
Jan 08 #Javascript
JS 操作Array数组的方法及属性实例解析
Jan 08 #Javascript
jquery 图片缩放拖动的简单实例
Jan 08 #Javascript
document.execCommand()的用法小结
Jan 08 #Javascript
You might like
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
asp批量修改记录的代码
2008/06/25 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
深入理解Angular中的依赖注入
2017/06/26 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python操作列表的函数使用代码详解
2017/12/28 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
食堂员工工作职责
2013/12/18 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
应届生求职自荐信
2014/07/04 职场文书
走进敬老院活动总结
2014/07/10 职场文书
2014年平安夜寄语
2014/12/08 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python