有谁知道任何变通办法来创建的about:blank
的iframe在IE页面上时, document.domain
改变?
IE似乎没有允许访问空/动态I帧后document.domain
性质已经改变。
例如,假设你是动态创建一个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浏览器。 这是特别令人沮丧,因为这会影响之后创建的I帧document.domain
属性发生变化时(如上面的例子)。
IE的规则似乎是“如果你改变后创建动态/空的iframe document.domain
,你不能访问它的DOM。”
iframe的设置src
到about:blank
javascript:void(0)
或javascript:""
一直未果。
你高兴的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>
标记起来。 见为什么-分裂的脚本标签
我总是在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>
如果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