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实现yield的方法
Nov 06 Javascript
JavaScript获取Url里的参数
Dec 18 Javascript
jQuery处理json数据返回数组和输出的方法
Mar 11 Javascript
详解angular 中的自定义指令之详解API
Jun 20 Javascript
JS实现的简单表单验证功能示例
Oct 13 Javascript
浅谈Fetch 数据交互方式
Dec 20 Javascript
Vue指令指令大全
Feb 09 Javascript
vue动态注册组件实例代码详解
May 30 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
Feb 06 Javascript
js代码实现轮播图
May 04 Javascript
使用JavaScript获取Django模板指定键值数据
May 27 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/03 冲泡冲煮
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
PHP扩展开发入门教程
2015/02/26 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
AJAX的使用方法详解
2017/04/29 PHP
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
django框架如何集成celery进行开发
2017/05/24 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
详解Python 函数如何重载?
2019/04/23 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
盛大笔试题
2016/11/05 面试题
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
安全检查与奖惩制度
2014/01/23 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
2014年质检员工作总结
2014/11/18 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
单位租房协议范本
2014/12/03 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
西游记读书笔记
2015/06/25 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
redis限流的实际应用
2021/04/24 Redis
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
一文搞懂Python Sklearn库使用
2021/08/23 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers