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 变量作用域分析
Jul 04 Javascript
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
Oct 23 Javascript
jQuery点击导航栏选中更换样式的实现代码
Jan 23 Javascript
react-native之ART绘图方法详解
Aug 08 Javascript
vue.js路由跳转详解
Aug 28 Javascript
bootstrap中selectpicker下拉框使用方法实例
Mar 22 Javascript
vue升级之路之vue-router的使用教程
Aug 14 Javascript
每个 JavaScript 工程师都应懂的33个概念
Oct 22 Javascript
VueQuillEditor富文本上传图片(非base64)
Jun 03 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 Javascript
详解ES6 扩展运算符的使用与注意事项
Nov 12 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php session安全问题分析
2011/06/24 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
JS获取时间的方法
2015/01/21 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
JS实现双击内容变为可编辑状态
2017/03/03 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
详解Angular 自定义结构指令
2017/06/21 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
python图书管理系统
2020/04/05 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
Python程序慢的重要原因
2020/09/04 Python
python 实现有道翻译功能
2021/02/26 Python
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
一年级班主任寄语
2014/01/19 职场文书
财产公证书样本
2014/04/04 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
整理Python中常用的conda命令操作
2021/06/15 Python