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实现多屏多图焦点图切换特效的方法
May 04 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
Jul 18 Javascript
AngularJS ng-mousedown 指令
Aug 02 Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 Javascript
强大的 Angular 表单验证功能详细介绍
May 23 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 Javascript
原生js实现点击轮播切换图片
Feb 11 Javascript
jquery实现两个div中的元素相互拖动的方法分析
Apr 05 jQuery
vue npm install 安装某个指定的版本操作
Aug 11 Javascript
javascript实现简易计算器功能
Sep 23 Javascript
js 数组 fill() 填充方法
Nov 02 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判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
Python中Numpy mat的使用详解
2019/05/24 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Django 批量插入数据的实现方法
2020/01/12 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
如何做好总经理助理
2013/11/12 职场文书
安全事故检讨书
2014/01/18 职场文书
优秀教师先进事迹
2014/01/22 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
2014年大学生工作总结
2014/11/20 职场文书
2014年派出所工作总结
2014/11/21 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android