咱们用原生JS进行开发时,常常会用到两种更新DOM节点的方法:innerHTML 和 appendChild() 。其中 innerHTML 会彻底替换掉原先的节点内容,若是咱们是想向元素追加子节点的话,那么 innerHTML 显然知足不了需求。 转而咱们就会想到 appendChild() 方法。appendChild方法接收的参数类型为单个的节点类型对象。所以当咱们要添加多个子节点时,只能经过循环来实现。web
例如:浏览器
for (var i = Things.length - 1; i >= 0; i--) { element.appendChild(Things[i]); }
咱们都知道,对DOM的操做次数越多,性能消耗也就越大。像这样的循环添加节点,循环了多少次,就对DOM操做了多少次,性能消耗明显是不划算的。咱们就会想,可否把要插入的节点进行打包,而后一次性添加呢?若是能够的话,那就只对DOM作了一次操做了。要实现打包,这就要用到咱们的主角 createDocumentFragment。app
DocumentFragments是DOM节点。它们不是主DOM树的一部分。一般的用例是建立文档片断,将元素附加到文档片断,而后将文档片断附加到DOM树。在DOM树中,文档片断被其全部的子元素所代替。由于文档片断存在于内存中,并不在DOM树中,因此将子元素插入到文档片断时不会引发页面回流(对元素位置和几何上的计算)。所以,使用文档片断一般会带来更好的性能。性能
示例:建立主流web浏览器列表spa
HTMLcode
<ul id="ul"></ul>
JAVASCRIPT对象
var element = document.getElementById('ul'); var fragment = document.createDocumentFragment(); var browsers = ['Firefox', 'Chrome', 'Opera', 'Safari', 'Internet Explorer']; browsers.forEach(function(browser) { var li = document.createElement('li'); li.textContent = browser; fragment.appendChild(li); // 此处往文档片断插入子节点,不会引发回流 (至关于打包操做) }); element.appendChild(fragment); // 将打包好的文档片断插入ul节点,只作了一次操做
参考资料: https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createDocumentFragmentblog