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 相关文章推荐
JavaScript中几种常见排序算法小结
Feb 22 Javascript
jQuery中调用WebService方法小结
Mar 28 Javascript
jquery给图片添加鼠标经过时的边框效果
Nov 12 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
BootStrap模态框不垂直居中的解决方法
Oct 19 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
angular 组件通信的几种实现方式
Jul 13 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
Apr 29 Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 Javascript
element ui分页多选,翻页记忆的实例
Sep 03 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
Oct 30 Javascript
js实现打字小游戏
Dec 17 Javascript
原生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 Try Catch异常测试
2009/03/01 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
YII中assets的使用示例
2014/07/31 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
Python生成随机数的方法
2014/01/14 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
对Django url的几种使用方式详解
2019/08/06 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
浅析Python3 pip换源问题
2020/01/06 Python
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
美术教学感言
2014/02/22 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
JavaScript ES6的函数拓展
2022/01/18 Javascript
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis