在document.domain更改后,无法在IE中访问about:blank iframe

时间:2013-02-05 19:33:47

标签: javascript internet-explorer dom iframe cross-domain-policy

about:blank发生变化时,是否有人知道在IE中的页面上创建document.domain 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 src设置为about:blank javascript:void(0)javascript:""已失败。

3 个答案:

答案 0 :(得分:5)

您是否乐意将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

答案 1 :(得分: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>

答案 2 :(得分:0)

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

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

在此处阅读有关同源政策的更多信息:

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

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