我正在努力弄清楚为什么我的代码以特定方式(而不是其他方式)工作:
+----------------------------+
| jsfiddle |
| |
| +---------+ |
| | | |
| | jsbin | |
| +---------+ |
+----------------------------+
目标:
jsfiddle
应该连接到jsbin
并jsbin
应该返回数据到jsfiddle
使用window.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行,我确实为附加了onload
处理程序iframe
。(loadRequest
)。
但是该loadRequest
方法-再次--attach (!! --line#5)一个onload
函数。
我不明白为什么它会这样工作。
我的意思是:常识告诉我该loadRequest
方法应该是:
function loadRequest()
{
alert(f.contentWindow.name);
frame.parentNode.removeChild(frame);
}
但这是行不通的。
我想念什么?(任何其他尝试都会显示:跨域错误)
您需要先将iframe窗口发送回父窗口可访问的域,然后再检查window.name
,否则会出现跨域错误。因此,在加载并设置了远程页面之后window.name
,您可以将其发送到about:blank
,而不受同一来源策略的限制,然后window.name
从父窗口中进行读取。
这里的第一个技巧是,window.name
无论您将窗口发送到何处,它都会缠住。因此,您将窗口发送到远程域,对其进行设置window.name
,将其发送回可访问域,然后进行读取。
在第二个诀窍是,about:blank
对于两个幸福的环境A
和B
。等等-没有跨域错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句