利用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 相关文章推荐
一个不错的应用,用于提交获取文章内容,不推荐用
Mar 03 Javascript
URL地址中的#符号使用说明
Feb 12 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
jQuery Mobile操作HTML5的常用函数总结
May 17 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
Mar 21 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
Aug 22 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
Apr 01 Javascript
VUE安装使用教程详解
Jun 03 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 Javascript
js 执行上下文和作用域的相关总结
Feb 08 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中使用灵巧的体系结构
2006/10/09 PHP
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
React 高阶组件入门介绍
2018/01/11 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
wxPython实现绘图小例子
2019/11/19 Python
python如何使用腾讯云发送短信
2020/09/17 Python
Python常用外部指令执行代码实例
2020/11/05 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
安全生产管理合理化建议书
2014/03/12 职场文书
节能环保口号
2014/06/12 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
国际商务专业求职信
2014/07/15 职场文书
房产协议书范本2014
2014/09/30 职场文书
个人原因辞职信模板
2015/05/13 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
TS 类型收窄教程示例详解
2022/09/23 Javascript