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


Posted in Javascript onApril 04, 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 相关文章推荐
图片无缝滚动代码(向左/向下/向上)
Apr 10 Javascript
js浏览器本地存储store.js介绍及应用
May 13 Javascript
jQuery中delegate()方法用法实例
Jan 19 Javascript
跟我学习javascript的严格模式
Nov 16 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
JS实现列表页面隔行变色效果
Mar 25 Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 Javascript
bootstrap模态框远程示例代码分享
May 22 Javascript
JavaScript实现求最大公共子串的方法
Feb 03 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
原生js获取宽高与jquery获取宽高的方法关系对比
Apr 04 #Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 #Javascript
javascript中的循环语句for语句深入理解
Apr 04 #Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
Apr 04 #Javascript
调试代码导致IE出错的避免方法
Apr 04 #Javascript
javascript写的一个模拟阅读小说的程序
Apr 04 #Javascript
js 显示base64编码的二进制流网页图片
Apr 04 #Javascript
You might like
PHP把小数转成整数3种方法
2014/06/30 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
js读取本地文件的实例
2017/12/22 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
Python网络编程详解
2017/10/31 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
电气专业推荐信范文
2013/11/18 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
酒店管理求职信
2014/06/09 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
2014年生产部工作总结
2014/12/17 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
2016高考感言
2015/08/01 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
python 逐步回归算法
2021/04/06 Python