2

我正在努力弄清楚为什么我的代码以特定方式(而不是其他方式)工作:

+----------------------------+
| jsfiddle                   |
|                            |
|              +---------+   |
|              |         |   |
|              |  jsbin  |   |
|              +---------+   |    
+----------------------------+

目标 :

jsfiddle应该 连接jsbin返回数据以使用(跨域技术)。jsbinjsfiddlewindow.name

(再次 - 代码正在工作)

jsbin's响应是一个 Html 页面:

  <script>
      window.name = 1*(new Date());
  </script>

这是代码jsFiddle

/*1*/   var f;
/*2*/   
/*3*/   function loadRequest()
/*4*/   {
/*5*/       f.onload = function ()
/*6*/       {
/*7*/           alert(f.contentWindow.name);
/*8*/           frame.parentNode.removeChild(frame);
/*9*/       }
/*10*/       f.src = 'about:blank';
/*11*/   }
/*12*/   
/*13*/   $(".b").on('click', function ()
/*14*/   {
/*15*/       f = document.createElement('iframe');
/*16*/       f.name = framename = 'fetchData';
/*17*/       f.onload = loadRequest;
/*18*/       f.src = 'http://jsbin.com/AjUyoYU/8/quiet';
/*19*/       document.body.appendChild(f);
/*20*/   });

如您所见 - 代码有效:http: //jsfiddle.net/7Nawt/2/

那么问题在哪里?

查看第 17 行,我确实为. ( )。onloadiframeloadRequest

但是该loadRequest方法 - 反过来又 --attachs (!! --line #5)一个onload函数。

我不明白为什么它这样工作。

我的意思是:常识告诉我loadRequest方法应该是:

function loadRequest()
    { 
             alert(f.contentWindow.name);
             frame.parentNode.removeChild(frame);
    }

但它不起作用。

我错过了什么?(任何其他尝试显示:跨域错误)

4

1 回答 1

3

您需要在检查之前将 iframe 窗口发送回父窗口可访问的域window.name,否则会出现跨域错误。因此,在它加载并且远程页面设置window.name后,您将其发送到about:blank不受同源策略约束的 ,然后window.name从父窗口读取。

这里的第一个技巧是,window.name无论您将窗口发送到何处,它都会一直存在。因此,您将窗口发送到远程域,让它设置window.name,将其发送回可访问的域,然后读取它。

第二技巧是about:blank为 BothAB. 等等 - 没有跨域错误。

于 2013-10-21T20:34:28.227 回答