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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
javascript 打印页面代码
Mar 24 Javascript
javascript 一些用法小结
Sep 11 Javascript
JavaScript中常见陷阱小结
Apr 27 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
js中hash和ico的关联分析
Feb 05 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
Jul 10 Javascript
AngularJS自定义指令之复制指令实现方法
May 18 Javascript
vue实现点击图片放大效果
Aug 15 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
Dec 15 Javascript
javascript异步编程的六种方式总结
May 17 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
Apr 03 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获取后台Job管理的实现代码
2011/06/10 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
vue中activated的用法
2021/01/03 Vue.js
Python中的面向对象编程详解(上)
2015/04/13 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
商场端午节活动方案
2014/01/29 职场文书
店面销售职位的职责
2014/03/09 职场文书
大学生年度个人总结
2015/02/15 职场文书
小学运动会报道稿
2015/07/22 职场文书
个人工作决心书
2015/09/22 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫