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中的$.getJSON 使用说明
Mar 10 Javascript
js中hash和ico的关联分析
Feb 05 Javascript
JavaScript定时显示广告代码分享
Mar 02 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
原生js获取元素样式的简单方法
Aug 06 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
react+redux的升级版todoList的实现
Dec 18 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
Dec 11 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
Vue-axios-post数据后端接不到问题解决
Jan 09 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 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
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
PHP编写RESTful接口
2016/02/23 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
日期 时间js控件
2009/05/07 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python编程中的for循环语句学习教程
2015/10/14 Python
详解flask表单提交的两种方式
2018/07/21 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python中调用其他程序的方式详解
2019/08/06 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
财务经理的岗位职责
2013/12/17 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
IT工程师岗位职责
2014/07/04 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
检察院起诉书
2015/05/20 职场文书
《落花生》教学反思
2016/02/16 职场文书