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 相关文章推荐
IE bug table元素的innerHTML
Jan 11 Javascript
JS实现的省份级联实例代码
Jun 24 Javascript
javascript使用avalon绑定实现checkbox全选
May 06 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
Aug 25 Javascript
angularjs学习笔记之完整的项目结构
Sep 26 Javascript
关于JavaScript作用域你想知道的一切
Feb 04 Javascript
jQuery Dialog对话框事件用法实例分析
May 10 Javascript
angular指令笔记ng-options的使用方法
Sep 18 Javascript
微信小程序云开发(数据库)详解
May 17 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 Javascript
JS实现按比例缩小图片宽高
Aug 24 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP云打印类完整示例
2016/10/15 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
通过javascript设置css属性的代码
2009/12/28 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
浅谈python数据类型及类型转换
2017/12/18 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
教育学专业毕业生的自我评价
2013/11/21 职场文书
11月红领巾广播稿
2014/01/17 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
交通文明倡议书
2014/05/16 职场文书
五四青年节的活动方案
2014/08/20 职场文书
如何写辞职信
2015/05/13 职场文书
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js