zoukankan      html  css  js  c++  java
  • window.name实现跨域数据传输

    偶然间碰到个问题,通过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

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/qingguo/p/5686303.html
Copyright © 2011-2022 走看看