我正在努力弄清楚为什么我的代码以特定方式工作(而不是以其他方式):
+----------------------------+
| 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
方法 - 反过来 - 再次使用(!! - line#5) onload
函数。
我不明白为什么 这样工作。
我的意思是:常识告诉我loadRequest
方法应该是:
function loadRequest()
{
alert(f.contentWindow.name);
frame.parentNode.removeChild(frame);
}
但它没有用。
我错过了什么? (显示任何其他尝试:跨域错误)
答案 0 :(得分:3)
在检查window.name
之前,您需要将iframe窗口发送回父窗口可访问的域,否则您将收到跨域错误。因此,在加载并且远程页面设置为window.name
之后,您将其发送到about:blank
,该window.name
不受同源策略的约束,然后从父窗口读取window.name
这里的第一个技巧是window.name
无论你在哪里发送窗口都会坚持到底。因此,您将窗口发送到远程域,让它设置为about:blank
,将其发送回可访问的域,然后阅读。
第二个技巧是A
是B
和{{1}}的愉快环境。所以 - 没有跨域错误。