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 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
jquery tab插件制作实现代码
Jun 22 Javascript
JSON格式的键盘编码对照表
Jan 29 Javascript
javascript中利用柯里化函数实现bind方法
Apr 29 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
Nov 07 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
浅谈jquery的html方法里包含特殊字符的处理
Nov 30 Javascript
干货!教大家如何选择Vue和React
Mar 13 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
Sep 20 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
Sep 17 Javascript
js 实现碰撞检测的示例
Oct 28 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
原生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
图形数字验证代码
2006/10/09 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
js实现时间日期校验
2020/05/26 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
详解Django中的权限和组以及消息
2015/07/23 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
wxpython布局的实现方法
2019/11/01 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
Python包和模块的分发详细介绍
2020/06/19 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
Django日志及中间件模块应用案例
2020/09/10 Python
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
社团文化节邀请函
2014/01/10 职场文书
生日寿宴答谢词
2014/01/19 职场文书
自荐信格式简述
2014/01/25 职场文书
公司拓展活动方案
2014/02/13 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python