利用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 相关文章推荐
JQuery选择器特辑 详细小结
May 14 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
Aug 18 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
JavaScript中的setUTCDate()方法使用详解
Jun 11 Javascript
如何在Linux上安装Node.js
Apr 01 Javascript
简单实现jQuery轮播效果
Aug 18 jQuery
vue中的scope使用详解
Oct 29 Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 jQuery
JQuery中queue方法用法示例
Jan 31 jQuery
JS中FormData类实现文件上传
Mar 27 Javascript
js面向对象编程OOP及函数式编程FP区别
Jul 07 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
初次接触php抽象工厂模式(Elgg)
2010/03/21 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
经验几则 推荐
2006/09/05 Javascript
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
Python中捕获键盘的方式详解
2019/03/28 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
python小白学习包管理器pip安装
2020/06/09 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
python压包的概念及实例详解
2021/02/17 Python
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
网络体系结构及协议的定义
2014/03/13 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
行政助理的职责
2013/11/14 职场文书
合作协议书范本
2014/04/17 职场文书
闪闪红星观后感
2015/06/08 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL