【发布时间】:2014-03-11 10:54:16
【问题描述】:
我想用 JavaScript 创建一个完全封装的子文档,有自己的<head>、<body>、样式、html 和 js。基本上是一个 shadow dom 或 iframe,但没有 src 属性。
虽然我喜欢 shadow dom 的想法,但它的 support is very low, 还没有准备好迎接黄金时段。
所以我一直致力于创建 iframe,但在此过程中遇到了各种障碍。 Here is a jsFiddle demonstrating my various attempts.
dom中不能存在iframe。这部分很关键。澄清一下,它暂时存在于dom中是可以的,但它必须能够被提取出来,并且只存在于js中。
$('body').append('<iframe id="iframeGenerator" />');
var iframe3 = $('#iframeGenerator');
var iframe3Contents = iframe3.contents();
$('#iframeGenerator').remove();
var head = iframe3.contents().find('head');
亲爱的,我们有头了
console.log(head.length);
但是内容是什么样的呢?
console.log(iframe3Contents.get(0));
它是一个文档,但不在元素内部 所以让我们试着把它放在 dom 或另一个元素的内部? 以下两种尝试都不起作用,因为选择器没有上下文或其他东西......
$('body').append(iframe3Contents);
var generatedIframe = $('<iframe />').append(iframe3Contents);
我希望能够在不向 dom 附加任何内容的情况下创建 iframe / subdocuemnt...但如果必须的话,我仍然希望能够随后将其从 dom 中删除并在 js 中进一步管理它。
我有这个小功能,它不起作用,但说明了我想要创建的 iframe 或子文档生成器的类型
var iframeHtml;
giveMeIframe = function() {
var iframeContents;
if (iframeHtml) {
return iframeHtml;
} else {
$('body').append('<iframe id="iframeGenerator" style="display: none" />');
iframeContents = $('#iframeGenerator').contents();
iframeHtml = $('<iframe />');
iframeHtml.append(iframeContents);
$('#iframeGenerator').remove();
return iframeHtml;
}
}
【问题讨论】:
-
试图将整个文档附加到
body是没有意义的(显然,我认为)。您在整个过程中的最终目标是什么? -
@CBroe 我希望能够封装页面的一部分,并在 JS 中生成这些封装的部分。你是对的,试图将文档附加到
body是人为的,但是将它附加到 iframe,当你向 dom 添加没有 src 的 iframe 时,浏览器会以某种方式自动执行此操作,我希望这更有意义。 -
如果你想要页面的部分,那你为什么需要一个
head和body元素呢?DocumentFragment不适用于您正在尝试做的事情......? -
@CBroe 文档片段无法封装 css,这是我需要的。
-
@Watson,您能否将所有封装的子文档 DOM 信息提供给 html2canvas,然后将生成的 js 输出作为子文档显示在您的页面上?
标签: javascript jquery iframe shadow-dom