用给定的HTMLdynamic创build一个iframe

我试图从JavaScript创build一个iframe,并用任意的HTML填充它,如下所示:

var html = '<body>Foo</body>'; var iframe = document.createElement('iframe'); iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html); 

我希望iframe ,然后包含一个有效的窗口和文件。 但是,情况并非如此:

> console.log(iframe.contentWindow);
空值

试试看: http : //jsfiddle.net/TrevorBurnham/9k9Pe/

我忽略了什么?

在JavaScript中设置新创build的iframesrc不会触发HTMLparsing器,直到元素被插入到文档中。 然后更新HTML,并且HTML分析器将被调用,并按照预期处理属性。

http://jsfiddle.net/9k9Pe/2/

 var iframe = document.createElement('iframe'); var html = '<body>Foo</body>'; iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html); document.body.appendChild(iframe); console.log('iframe.contentWindow =', iframe.contentWindow); 

另外这个回答你的问题,重要的是要注意,这种方法有一些浏览器的兼容性问题,请参阅@mschr的跨浏览器解决scheme的答案。

Allthough你的src = encodeURI应该工作,我会采取不同的方式:

 var iframe = document.createElement('iframe'); var html = '<body>Foo</body>'; document.body.appendChild(iframe); iframe.contentWindow.document.open(); iframe.contentWindow.document.write(html); iframe.contentWindow.document.close(); 

由于这没有x域限制,并且完全通过iframe句柄来完成,所以稍后可以访问和操作框架的内容。 所有你需要确定的是,内容已经被渲染,这将(取决于浏览器types)在发出.write命令期间/之后启动 – 但是在调用close()时不会执行。

做一个callback的100%兼容的方式可以是这种方法:

 <html><body onload="parent.myCallbackFunc(this.window)"></body></html> 

但是,iframe具有onload事件。 这是一种访问内部html作为DOM(js)的方法:

 iframe.onload = function() { var div=iframe.contentWindow.document.getElementById('mydiv'); }; 

谢谢你的好问题,这让我出了几次机会。 当使用dataURI HTML源代码时,我发现我必须定义一个完整的HTML文档。

看下面一个修改的例子。

 var html = '<html><head></head><body>Foo</body></html>'; var iframe = document.createElement('iframe'); iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html); 

注意用<html>标签和iframe.srcstring包装的html内容。

iframe元素需要被添加到DOM树中才能被parsing。

 document.body.appendChild(iframe); 

除非您在浏览器上disable-web-security ,否则您将无法检查iframe.contentDocument 。 你会得到一个消息

DOMException:无法从“HTMLIFrameElement”中读取“contentDocument”属性:阻止源“ http:// localhost:7357 ”的帧访问跨源帧。

还有一种方法可以创build一个iframe,其内容是一个HTMLstring: srcdoc属性 。 这在旧版本的浏览器(主要包括: Internet Explorer,也可能是Safari ?)中不被支持,但是这种行为有一个polyfill ,你可以在IE中添加条件注释,或者使用像has.js这样的条件懒惰加载它。