我已经搜索了stackoverflow问题并发现了关于同一主题的几个问题,但是他们都没有找到我想要的广泛答案。大多数答案都围绕着表现,但我也在寻找其他差异。基本上,this one简洁地总结了这个问题:
如果我在变量中创建一个元素(例如),但是不要 将它附加到DOM,添加元素(div,表格等)和东西 完成所有工作后(循环,验证,造型) 元素),附加该元素,它是否与片段相同?
我已经决定再次试一试,看看是否有人能给出一个好的答案。
那么,为什么我要使用它:
var fragment = document.createDocumentFragment();
var divContainer = document.createElement("div");
var divHeader = document.createElement("div");
divContainer.appendChild( divHeader );
fragment.appendChild( divContainer );
document.getElementById("someElement").appendChild( fragment.cloneNode(true) );
而不是:
var divContainer = document.createElement("div");
var divHeader = document.createElement("div");
divContainer.appendChild( divHeader );
document.getElementById("someElement").appendChild( divContainer );
答案 0 :(得分:6)
两种方法大致相同,因为它们都可以用于存储元素而无需立即修改DOM。虽然有一些捕获量。
div
有原型链HTMLDivElement - HTMLElement - Element - Node - EventTarget
,而document-fragment
有DocumentFragment - Node - EventTarget
。这意味着div
有更多可用的方法和属性(例如innerHTML
)。div
时,插入整个元素,变量仍然引用该元素。附加document-fragment
插入其所有内容,使变量引用空片段。document-fragment
:var fragment = document.createDocumentFragment();
var div1 = document.createElement('div');
var div2 = document.createElement('div');
var div3 = document.createElement('div');
fragment.appendChild(div1);
fragment.appendChild(div2);
div2.appendChild(div3); //fragment now contains the sub-tree
document.body.appendChild(fragment); //fragment is now an empty document-fragment, and is not in the DOM.
结果:
<body>
<div></div> <!--div1-->
<div> <!--div2-->
<div></div> <!--div3-->
</div>
</body>
div
:var container = document.createElement('div');
var div1 = document.createElement('div');
var div2 = document.createElement('div');
var div3 = document.createElement('div');
container.appendChild(div1);
container.appendChild(div2);
div2.appendChild(div3); //container is now a div with the sub-tree inside.
document.body.appendChild(container); //container is still the div with the sub-tree, but is now in the DOM.
结果:
<body>
<div> <!--container-->
<div></div> <!--div1-->
<div> <!--div2-->
<div></div> <!--div3-->
</div>
</div>
</body>
element
。element
。document-fragment
。答案 1 :(得分:0)
您可能正在尝试比较DocumentFragments
插入方法与使用innerHTML
生成DOM树。
首先让我们从definition开始:
DocumentFragment是一个没有父文档的最小文档对象。它 用作文件的轻量版本,以存储格式良好或 可能是格式不正确的XML片段。
所以使用DocumentFragments确实存在结构差异:在添加DOM元素之前,我们可以访问不同的DOM方法。
此外,DocumentFragments是much faster,而不是在循环的末尾附加一个带有div.innerHTML = '...'
的大HTML文本,因为DOM结构不应该动态生成,它已经可以从Fragment中获得。 / p>