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 相关文章推荐
图片自动缩小 点击放大
Jul 07 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
Jan 21 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
Nov 18 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
React Native中NavigatorIOS组件的简单使用详解
Jan 27 Javascript
angularJs在多个控制器中共享服务数据的方法
Sep 30 Javascript
layDate插件设置开始和结束时间
Nov 15 Javascript
vue使用i18n实现国际化的方法详解
Sep 05 Javascript
JS数组方法reverse()用法实例分析
Jan 18 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设置一边执行一边输出结果的代码
2013/09/30 PHP
PHP进程通信基础之信号
2017/02/19 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
Angular实现响应式表单
2017/08/04 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
Python MD5加密实例详解
2017/08/02 Python
简单了解Python中的几种函数
2017/11/03 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
Python关于反射的实例代码分享
2020/02/20 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
Python爬取梨视频的示例
2021/01/29 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
老总助理工作岗位职责
2014/02/06 职场文书
目标管理责任书
2014/04/15 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
导游词之杭州西湖
2019/09/19 职场文书