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 相关文章推荐
神奇的代码 通杀各种网站-可随意修改复制页面内容
Jul 17 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
Nov 03 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 Javascript
必备的JS调试技巧汇总
Jul 20 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
Node学习记录之cluster模块
May 31 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 Javascript
vue视图不更新情况详解
May 16 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
Sep 21 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
Nov 15 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 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表单文件iframe异步上传实例讲解
2017/07/26 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
Python中extend和append的区别讲解
2019/01/24 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
django的autoreload机制实现
2020/06/03 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
三爱活动实施方案
2014/03/19 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
皇城相府导游词
2015/02/06 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers