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 replace 字符替换实现代码
Dec 02 Javascript
IE6/7/8/9不支持exec的简写方式
May 25 Javascript
javascript时间函数大全
Jun 30 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
jquery中实现时间戳与日期相互转换
Apr 12 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 Javascript
ajax异步请求详解
Jan 06 Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 Javascript
图片加载完成再执行事件的实例
Nov 16 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
Vue初始化中的选项合并之initInternalComponent详解
Jun 11 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 变量类型的强制转换
2009/10/23 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
javascript模拟命名空间
2015/04/17 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
简单实现python爬虫功能
2015/12/31 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
python爬虫实例详解
2018/06/19 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
教师评优的个人自我评价分享
2013/09/19 职场文书
化工操作工岗位职责
2014/04/29 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android