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 相关文章推荐
下载文件个别浏览器文件名乱码解决办法
Mar 19 Javascript
iframe窗口高度自适应的实现方法
Jan 08 Javascript
jquery scroll()区分横向纵向滚动条的方法
Apr 04 Javascript
javascript获取flash版本号的方法
Nov 20 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
Mar 04 Javascript
JavaScript验证Email(3种方法)
Sep 21 Javascript
深入浅析JavaScript中的constructor
Apr 19 Javascript
一次$.getJSON不执行的简单记录
Jul 19 Javascript
在javascript中使用com组件的简单实现方法
Aug 17 Javascript
jQuery simpleModal插件的使用介绍
Aug 30 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 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
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php中大括号作用介绍
2012/03/22 PHP
php命令行用法入门实例教程
2014/10/27 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript  Error 对象 错误处理
2008/05/18 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
10条PHP编程习惯
2014/05/26 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
分公司经理岗位职责
2013/11/11 职场文书
寒假实习自荐信
2014/01/26 职场文书
三万活动总结
2014/04/28 职场文书
计算机系本科生求职信
2014/05/31 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
《去年的树》教学反思
2016/02/18 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
Python图片检索之以图搜图
2021/05/31 Python
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
mysql数据库隔离级别详解
2022/06/16 MySQL