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 相关文章推荐
Javascript模块模式分析
May 16 Javascript
javascript学习笔记(五)正则表达式
Apr 08 Javascript
js原型链原理看图说明
Jul 07 Javascript
JavaScript中判断整字类型最简洁的实现方法
Nov 08 Javascript
jQuery操作表单常用控件方法小结
Mar 23 Javascript
js生成验证码并直接在前端判断
May 15 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
bootstrap响应式表格实例详解
May 15 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 Javascript
解决node终端下运行js文件不支持ES6语法
Apr 04 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 socket 模拟POST 请求实例代码
2016/07/18 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
2017/07/06 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
Python 列表的清空方式
2020/01/13 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
django从后台返回html代码的实例
2020/03/11 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
员工拓展培训方案
2014/02/15 职场文书
四年级学生评语大全
2014/04/21 职场文书
干部培训工作总结2015
2015/05/25 职场文书
教育读书笔记
2015/07/02 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
Python OpenCV之常用滤波器使用详解
2022/04/07 Python