10

有谁知道about:blank在 IE 页面上创建 iframe的任何变通方法document.domain

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 规则似乎是“如果您在更改后创建动态/空 iframe document.domain,则无法访问其 DOM。”

将 iframe 设置srcabout:blank javascript:void(0)javascript:""未成功。

4

3 回答 3

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>标记。查看为什么拆分脚本标签

于 2013-02-14T11:56:31.070 回答
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>
于 2013-02-11T18:06:56.877 回答
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

于 2013-02-14T09:24:50.343 回答