iframe跨域通信封装详解


Posted in Javascript onAugust 11, 2015

iframe跨域通信

查看演示        源码下载

众所周知,由于前端javascript对跨域访问做了安全限制,javascript只能访问与包含它的文档在同一域下的内容。

用法举例:

需求是在http://www.demo.org/top.html中通过iframe方式嵌入http://www.iframe.com/iframe.html,而在iframe页面中希望通过点击一个按钮,调用top页面的一个js方法。

1. 在top页面中建立方法供内部页面使用

function testFun (text) {

 alert(text);

}

2. 在http://www.demo.org/top.html中嵌入iframe

<iframe width="320" height="240" src="http://www.iframe.com/iframe.html"></iframe>

3. 建立www.demo.org域下建立一个代理页面http://www.demo.org/proxy.html用于跨域通信使用

4. 在http://www.demo.org/proxy.html加入用于代理页面的逻辑

5. 在http://www.iframe.com/iframe.html页面中通过js配置代理页面地址

TopProxyConfig = {url:'http://www.demo.org/proxy.html'};

6. 通过kissy加载通信模块

KISSY.use('topproxy', function(S, TopProxy){

//执行代码

});

7. 在http://www.iframe.com/iframe.html通过TopProxy.call直接访问http://www.demo.org/top.html中的方法,如

KISSY.use('topproxy', function(S, TopProxy){
 TopProxy.call('testFun', '这是一个真实的故事');
});

其中call方法的第一个参数是外部网页的全局方法名,支持“.”,后面参数无限个,均传到目标方法里去。

注:

1. 调用后可能不会立即执行,会等到iframe加载完毕后才触发,如果想预加载可以提前执行一个没用的方法。
2. 如果不设置TopProxyConfig,那么会认为引用iframe和父iframe同域(大域)并直接调用top对象。
3. 在IE678下可能直接调用top中的系统方法会报错,由于系统方法不支持apply。

原理:

A页面嵌日的iframe页面B,其中B想调用A的方法并传递数据,那么可在B中嵌入A页面同域下的一个iframe页面C,C可以通过window.top访问到A的window。那么在B中可以改变C的href的hash向C传递一些信息,然后C再把这些信息传递给A,从而间接达到B给A传递信息的目的

Javascript 相关文章推荐
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 Javascript
jQuery包裹节点用法完整示例
Sep 13 Javascript
html5 canvas 详细使用教程
Jan 20 Javascript
详解angular 中的自定义指令之详解API
Jun 20 Javascript
vue使用vue-cli快速创建工程
Jul 28 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
Vue-Router的使用方法
Sep 05 Javascript
小程序实现订单倒计时功能
Apr 23 Javascript
微信小程序和百度的语音识别接口详解
May 06 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
Sep 16 Javascript
vue 全局封装loading加载教程(全局监听)
Nov 05 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
Aug 11 #Javascript
JS+CSS实现美化的下拉列表框效果
Aug 11 #Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
Aug 11 #Javascript
JavaScript设置表单上传时文件个数的方法
Aug 11 #Javascript
js限制文本框只能输入中文的方法
Aug 11 #Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 #Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
Aug 11 #Javascript
You might like
PHP中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
php 读取文件乱码问题
2010/02/20 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
python常用知识梳理(必看篇)
2017/03/23 Python
python3 读取Excel表格中的数据
2018/10/16 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Django的models中on_delete参数详解
2019/07/16 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
环保建议书400字
2014/05/14 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
二胎满月酒致辞
2015/07/29 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS