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 相关文章推荐
奇妙的js
Sep 24 Javascript
Jquery替换已存在于element上的event的方法
Mar 09 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
Jul 13 Javascript
jQuery 联动日历实现代码
May 31 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
深入理解bootstrap框架之入门准备
Oct 09 Javascript
简单实现js无缝滚动效果
Feb 05 Javascript
JS对象创建的几种方式整理
Feb 28 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python连接DB2数据库
2016/08/27 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
python删除服务器文件代码示例
2018/02/09 Python
python调用自定义函数的实例操作
2019/06/26 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
一道SQL存储过程面试题
2016/10/07 面试题
电信专业应届生自荐信
2013/09/28 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
婚前财产公证书
2014/04/10 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
党员目标管理责任书
2014/07/25 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
Golang 结构体数据集合
2022/04/22 Golang