2013-02-05 43 views
10

有没有人知道在document.domain发生更改时在IE的页面上创建about:blank iframe的任何解决方法?无法在document.domain更改后在IE中访问about:空白iframe

document.domain属性被更改后,IE似乎不允许访问空/动态iframe。

例如,假设你是动态创建一个iframe,然后注入一些HTML进去:

// Somewhere else, some 3rd party code changes the domain 
// from something.foo.com to foo.com 
document.domain = 'jshell.net'; 

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 

// In IE, we can't access the iframe's contentWindow! Access is denied. 
iframe.contentWindow.document.body.style.backgroundColor = 'red'; 

这里有一个的jsfiddle活生生的例子:http://jsfiddle.net/XHkUT/

你会发现它工作正常FF/Webkit,但不包含IE。这特别令人沮丧,因为这会影响document.domain属性已更改(如上面的示例中)后创建的iframe。

IE规则似乎是“如果您在更改document.domain后创建动态/空iframe,则无法访问其DOM。”

设置iframe srcabout:blankjavascript:void(0)javascript:""已失败。

+0

* about:*协议可能会受限于IE设置/版本:http://msdn.microsoft.com/en-us/library/ee330729(v=vs.85).aspx(请参阅'关于协议限制“章节) –

+1

注意:此错误在IE11中似乎已得到修复。 – EricLaw

回答

4

你高兴的iframe的域改变?在IE7,9下工作(对我来说)

document.domain = 'jshell.net'; 

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
iframe.src = "javascript:document.write('<script>document.domain=\"jshell.net\"</script>')"; 

// Now write some content to the iframe 
iframe.contentWindow.document.write('<html><body><p>Hello world</p></body></html>'); 

编辑:如果这是内嵌脚本页面上,那么你需要分割收盘</script>标签了。请参阅why-split-the-script-tag

+0

这工作,谢谢。它也似乎在FF/Webkit中很好地工作。您需要在'src'字符串中拆分'

0

我一直通过将iframe的src设置为与父域相同的空白文件来解决这类问题。如果有可能创建jshell.net这样一个文件,我建议是这样的:

var iframe = document.createElement('iframe'); 
iframe.src = 'http://jshell.net/blank.html'; 
document.body.appendChild(iframe); 

blank.html只包含一个小样板,例如:

<html><head><title>about:blank</title><head><body></body></html> 
+0

不幸的是,脚本托管的域没有写访问权限(Javascript代码本身是一个需要到处运行的小部件)。 – smithclay

0

如果iframe.src和文档。位置在不同的域(或子域)上,您根据定义不能从父项访问子项。但是,您可以从孩子访问父母。加载跨域JavaScript时使用的技术之一是使用iframe可以在加载时调用容器窗口中的方法的事实。

只有当两个文档位于不同的子域中时,才可以调整document.domain以匹配iframe.src的域以启用访问。

了解更多关于同源策略,在这里:

http://en.wikipedia.org/wiki/Same_origin_policy

http://softwareas.com/cross-domain-communication-with-iframes

相关问题