当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:""
已失败。
答案 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