3

我认为 DocumentFragment 的全部意义在于能够在不接触 DOM 的情况下构造内容,直到它准备就绪。

鉴于 DocumentFragment 不支持innerHTML,它可能有点乏味。另一方面,一旦构建完成,通过片段本身很容易将内容添加到现有的 DOM 节点。

如果我创建一个div而不将它添加到 DOM,我可以按照我喜欢的方式填充它,包括innerHTML. 据我所知,它应该不会对性能产生额外的影响。

是否有一种简单的方法(即一行左右)将现有 DOM 节点的内容复制到 DocumentFragment?该过程如下所示:

var div=document.createElement('div');
var fragment=document.createDocumentFragment();
div.innerHTML='…';
//  copy contents to fragment
//  etc

这样我就可以两全其美了。

回答

下面是@KevBot 的答案,并入示例中:

var divTest=document.querySelector('div#test');

var html='<p>One</p><p>Two</p>';
var fragment=document.createRange().createContextualFragment(html);

divTest.appendChild(fragment);
4

4 回答 4

7

document.createRange是的,您可以使用该方法轻松创建带有 HTML 字符串的片段。

document.createRange返回一个Range对象,该对象有一个被调用的方法createContextualFragment,允许您从 HTML 中获取片段。

function fragmentFromString(strHTML) {
  return document.createRange().createContextualFragment(strHTML);
}

let div = document.createElement('div');
div.innerHTML = '<p>Testing</p>';

let fragment = fragmentFromString(div.innerHTML);
console.log(fragment);
<div>
  <p>Random Content</p>
</div>

适用于所有主流浏览器和 IE11。

于 2017-01-21T02:39:01.163 回答
4

您可以创建一个<template>元素,它是一个文档片段;元素集.innerHTML,并使用属性template获取元素.innerHTMLtemplate.content

var template = document.createElement("template");
var div = document.createElement("div");
div.innerHTML = "<p>abc</p>";
template.innerHTML = div.innerHTML;
document.body.appendChild(template.content);

于 2017-01-21T01:54:18.220 回答
1

您可以使用appendChild将新元素添加到片段中。

var div=document.createElement('div');
var fragment=document.createDocumentFragment();
div.innerHTML='…';

fragment.appendChild(div);

如果您只想将元素的内容注入到片段中,那么您可以遍历childNodes并将它们插入到片段中。

div.childNodes.forEach(function(node) {
    fragment.appendChild(node);
});
于 2017-01-21T01:38:57.303 回答
1

试试这些尺寸

text = frag.appendChild( document.createTextNode( "insert text here" ) )

或者

text = frag.appendChild( document.createTextNode( div.innerHTML ) )

或者

text = frag.appendChild( document.createTextNode( div.textContent ) )

text变量将保存文本节点,而您还将文本节点全部附加在一行中

于 2017-01-21T01:46:06.353 回答