利用location.hash实现跨域iframe自适应


Posted in Javascript onMay 04, 2010

页面域关系:

主页面a.html所属域A:3water.com
被iframe的页面b.html所属域B:www.baidu.com,假设地址:http://www.baidu.com/b.html

实现效果:

A域名下的页面a.html中通过iframe嵌入B域名下的页面b.html,由于b.html的宽度和高度是不可预知而且会变化的,所以需要a.html中的iframe自适应大小.

问题本质:

js对跨域iframe访问问题,因为要控制a.html中iframe的高度和宽度就必须首先读取得到b.html的大小,A、B不属于同一个域,浏览器为了安全性考虑,使js跨域访问受限,读取不到b.html的高度和宽度.

解决方案:

引入代理代理页面c.html与a.html所属相同域A,c.html是A域下提供好的中间代理页面,假设c.html的地址:3water.com/c.html,它负责读取location.hash里面的width和height的值,然后设置与它同域下的a.html中的iframe的宽度和高度.

代码如下:

a.html代码

首先a.html中通过iframe引入了b.html

<iframe id=”b_iframe” height=”0″ width=”0″ src=”http://www.baidu.com/b.html” frameborder=”no” border=”0px” marginwidth=”0″ marginheight=”0″ scrolling=”no” allowtransparency=”yes” ></iframe>

b.html代码
<script type=”text/javascript”> 
var b_width = Math.max(document.documentElement.clientWidth,document.body.clientWidth); 
var b_height = Math.max(document.documentElement.clientHeight,document.body.clientHeight); 
var c_iframe = document.getElementById(”c_iframe”); 
c_iframe.src = c_iframe.src+”#”+b_width+”|”+b_height; //https://3water.com/c.html#width|height” 
} 
</script>

<!?js读取b.html的宽和高,把读取到的宽和高设置到和a.html在同一个域的中间代理页面车c.html的src的hash里面?>
<iframe id=”c_iframe” height=”0″ width=”0″ src=”https://3water.com/c.html” style=”display:none” ></iframe>

c.html代码

<script type=”text/javascript”> 
var b_iframe = parent.parent.document.getElementById(”b_iframe”); 
var hash_url = window.location.hash; 
var hash_width = hash_url.split(”#”)[1].split(”|”)[0]+”px”; 
var hash_height = hash_url.split(”#”)[1].split(”|”)[1]+”px”; 
b_iframe.style.width = hash_width; 
b_iframe.style.height = hash_height; 
</script>

a.html中的iframe就可以自适应为b.html的宽和高了.

其他一些类似js跨域操作问题也可以按这个思路去解决

如果不是跨域访问,可以参考这篇文章。iframe自适应高度的多种方法方法小结

Javascript 相关文章推荐
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
Aug 31 Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 Javascript
纯JS焦点图特效实例(可一个页面多用)
Dec 07 Javascript
vue.js中mint-ui框架的使用方法
May 12 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
详解微信小程序缓存--缓存时效性
May 02 Javascript
微信小程序实现动态列表项的顺序加载动画
Jul 25 Javascript
详解Vue router路由
Nov 20 Vue.js
小程序实现侧滑删除功能
Jun 25 Javascript
Array.prototype 的泛型应用分析
Apr 30 #Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 #Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
Apr 29 #Javascript
匹配任意字符的正则表达式写法
Apr 29 #Javascript
jquery ajax提交表单数据的两种实现方法
Apr 29 #Javascript
jQuery 动画弹出窗体支持多种展现方式
Apr 29 #Javascript
jQuery 工具函数学习资料
Apr 29 #Javascript
You might like
PHP 批量删除 sql语句
2009/06/05 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
php实现的RSS生成类实例
2015/04/23 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
.NET方向面试题
2014/11/20 面试题
Linux内核产生并发的原因
2016/11/08 面试题
建筑班组长岗位职责
2014/01/02 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers