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中的对象和数组的应用技巧
Jan 07 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
Apr 01 Javascript
javascript学习笔记(五) Array 数组类型介绍
Jun 19 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
AngularJS ng-blur 指令详解及简单实例
Jul 30 Javascript
AngularJS ng-mousedown 指令
Aug 02 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
详解javascript appendChild()的完整功能
Aug 18 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
Jul 25 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中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
解析isset与is_null的区别
2013/08/09 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
银行奉献演讲稿
2014/09/16 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang