javascript跨域总结之window.name实现的跨域数据传输


Posted in Javascript onNovember 01, 2015

自己实践了一下,真的很好用。特将具体实现方法记录如下

有三个页面:

    a.com/app.html:应用页面。
    a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需要和应用页面在同一域下。
    b.com/data.html:应用页面需要获取数据的页面,可称为数据页面。

实现起来基本步骤如下:

    在应用页面(a.com/app.html)中创建一个iframe,把其src指向数据页面(b.com/data.html)。
    数据页面会把数据附加到这个iframe的window.name上,data.html代码如下:

<script type="text/javascript">
    window.name = 'I was there!';  // 这里是要传输的数据,大小一般为2M,IE和firefox下可以大至32M左右
                     // 数据格式可以自定义,如json、字符串
  </script>

    在应用页面(a.com/app.html)中监听iframe的onload事件,在此事件中设置这个iframe的src指向本地域的代理文件(代理文件和应用页面在同一域下,所以可以相互通信)。app.html部分代码如下:

<script type="text/javascript">
    var state = 0, 
    iframe = document.createElement('iframe'),
    loadfn = function() {
      if (state === 1) {
        var data = iframe.contentWindow.name;  // 读取数据
        alert(data);  //弹出'I was there!'
      } else if (state === 0) {
        state = 1;
        iframe.contentWindow.location = "http://a.com/proxy.html";  // 设置的代理文件
      } 
    };
    iframe.src = 'http://b.com/data.html';
    if (iframe.attachEvent) {
      iframe.attachEvent('onload', loadfn);
    } else {
      iframe.onload = loadfn;
    }
    document.body.appendChild(iframe);
  </script>

    获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)。

<script type="text/javascript">
    iframe.contentWindow.document.write('');
    iframe.contentWindow.close();
    document.body.removeChild(iframe);
  </script>

总结起来即:iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

Javascript 相关文章推荐
JavaScript 调试器简介
Feb 21 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
Jul 31 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
Apr 12 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
Apr 18 Javascript
什么是 AngularJS?AngularJS简介
Dec 06 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
微信小程序实现图片轮播及文件上传
Apr 07 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
vue-cli webpack 开发环境跨域详解
May 18 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
Feb 22 Javascript
JavaScript监听一个DOM元素大小变化
Apr 26 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
Nov 01 #Javascript
JS实现的论坛Ajax打分效果完整实例
Oct 31 #Javascript
JS实现来回出现文字的状态栏特效代码
Oct 31 #Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 #Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
Oct 31 #Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 #Javascript
js实现点击获取验证码倒计时效果
Jan 28 #Javascript
You might like
PHP新手上路(五)
2006/10/09 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
vue.js父组件使用外部对象的方法示例
2017/04/25 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
python 实现视频 图像帧提取
2019/12/10 Python
python梯度下降算法的实现
2020/02/24 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
优秀教师单行材料
2014/12/16 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
网络管理员岗位职责
2015/02/12 职场文书
单位介绍信格式范文
2015/05/04 职场文书
2016中秋节广告语
2016/01/28 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript