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 相关文章推荐
js实现广告漂浮效果的小例子
Jul 02 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
AngularJS入门教程之迭代器过滤详解
Aug 18 Javascript
详解js的事件处理函数和动态创建html标记方法
Dec 16 Javascript
Angular-Touch库用法示例
Dec 22 Javascript
jQuery实现select模糊查询(反射机制)
Jan 14 Javascript
bootstrap table动态加载数据示例代码
Mar 25 Javascript
如何编写jquery插件
Mar 29 jQuery
node.js中使用Export和Import的方法
Sep 18 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
Jan 03 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+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
Prototype String对象 学习
2009/07/19 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
Python字符串处理实例详解
2017/05/18 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
基于python实现学生管理系统
2018/10/17 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
Django 路由控制的实现
2019/07/17 Python
使用Python实现画一个中国地图
2019/11/23 Python
如何基于Python按行合并两个txt
2020/11/03 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
Python datetime模块的使用示例
2021/02/02 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
Foreo国际站:Foreo International
2018/10/29 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
军训的自我鉴定
2013/12/10 职场文书
建筑专业自荐信范文
2014/01/05 职场文书
销售2014年度工作总结
2014/12/08 职场文书
客户经理岗位职责
2015/01/31 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
Python实现滑雪小游戏
2021/09/25 Python