JS性能优化 之 文档片断 createDocumentFragment

咱们用原生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

相关文章
相关标签/搜索