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 的 prototype问题。
Jan 03 Javascript
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
Nov 06 Javascript
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
Javascript中的String对象详谈
Mar 03 Javascript
使用javascript实现简单的选项卡切换
Jan 09 Javascript
jQuery实现div跟随鼠标移动
Aug 20 jQuery
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
javascript头像上传代码实例
Sep 28 Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 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获取http请求的头信息实现步骤
2012/12/16 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
JS命名空间的另一种实现
2013/08/09 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
vue动态子组件的两种实现方式
2019/09/01 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
python复制文件代码实现
2013/12/23 Python
玩转python爬虫之正则表达式
2016/02/17 Python
基于Python的接口测试框架实例
2016/11/04 Python
python2.7实现爬虫网页数据
2018/05/25 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Python异常处理例题整理
2019/07/07 Python
python实现猜数字游戏
2020/03/25 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
后勤主管工作职责
2013/12/07 职场文书
报告会主持词
2014/04/02 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
群众路线个人整改方案
2014/10/25 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python