用给定的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的iframe
的src
不会触发HTMLparsing器,直到元素被插入到文档中。 然后更新HTML,并且HTML分析器将被调用,并按照预期处理属性。
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.src
string包装的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这样的条件懒惰加载它。