偶然间碰到个问题,通过JS给window.name赋值数组情况下,在firefox与chrome下会转换为字符串类型,在IE11下则显示正常。不说了,上图(firefox下):

代码:

<script type="text/javascript">
var name = [1,2,3];
console.log(typeof name);
console.log(name.length);
for(var i in name){
console.log(name[i]);
}
</script>

google了一下,发现可以通过window.name属性实现数据的跨域传输。

有三个页面:

  • a.com/app.html:应用页面。
  • a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需要和应用页面在同一域下。
  • b.com/data.html:应用页面需要获取数据的页面,可称为数据页面。

实现起来基本步骤如下:

  1. 在应用页面(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>
  2. 在应用页面(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>
  3. 获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)。
    <script type="text/javascript">
    iframe.contentWindow.document.write('');
    iframe.contentWindow.close();
    document.body.removeChild(iframe);
    </script>

总结起来即:iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

原文摘自:http://www.cnblogs.com/rainman/archive/2011/02/21/1960044.html

最新文章

  1. css三级菜单效果
  2. Microservice 微服务的理论模型和现实路径
  3. jquery 如何去除select 控件重复的option
  4. 【转载】GUID vs INT Debate
  5. checkbox复选框全选
  6. 浏览器被hao.360.cn劫持怎么办
  7. RouterOS的MikroTik脚本从DNS更新IPSEC端的IP地址
  8. python类的继承
  9. 7-ajax的同步和异步?
  10. Highways(求最小生成树的最大边)
  11. 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具)
  12. 如何将plist大图拆分成原来的小图
  13. VP9 vs H.265——下一代视频编码标准的王道之争
  14. installshield路径
  15. Oracle实现like多个值的查询
  16. PLSQL Developer 连接Linux 下Oracle的安装与配置
  17. python中常用的模块二
  18. linux系统nginx的https的跳转
  19. 【BZOJ2820】ygy的gcd
  20. editplus修改配置文件保存位置

热门文章

  1. 使用aiohttp的一个小例子
  2. 【排序算法】java实现
  3. android studio 无法调试debug,(能运行安装)
  4. Usage of API documented as @since 1.6+
  5. MySql笔记之修改MySQL提示符
  6. hiho一下第128周 后缀自动机二&#183;重复旋律5
  7. [POI2014]Tourism
  8. 3.1.g 找出在2009年秋季拥有最多选课人数的课程段
  9. xcode里面使用Memory Leaks和Instruments检测内存泄漏
  10. Spring Boot中使用Feign调用时Hystrix提示异常:&quot;could not be queued for execution and no fallback available.&quot;以及&quot;Rejected command because thread-pool queueSize is at rejection threshold&quot;