欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS性能优化 之 文档片段 createDocumentFragment

程序员文章站 2024-02-01 20:20:10
我们用原生JS进行开发时,经常会用到两种更新DOM节点的方法:innerHTML 和 appendChild() 。其中 innerHTML 会完全替换掉原先的节点内容,如果我们是想向元素追加子节点的话,那么 innerHTML 显然满足不了需求。 转而我们就会想到 appendChild() 方法 ......

我们用原生js进行开发时,经常会用到两种更新dom节点的方法:innerhtml 和 appendchild() 。其中 innerhtml 会完全替换掉原先的节点内容,如果我们是想向元素追加子节点的话,那么 innerhtml 显然满足不了需求。 转而我们就会想到 appendchild() 方法。appendchild方法接收的参数类型为单个的节点类型对象。因此当我们要添加多个子节点时,只能通过循环来实现。

例如:

for (var i = things.length - 1; i >= 0; i--) {
    element.appendchild(things[i]);
}

 

我们都知道,对dom的操作次数越多,性能消耗也就越大。像这样的循环添加节点,循环了多少次,就对dom操作了多少次,性能消耗明显是不划算的。我们就会想,能否把要插入的节点进行打包,然后一次性添加呢?如果可以的话,那就只对dom做了一次操作了。要实现打包,这就要用到我们的主角 createdocumentfragment。

documentfragments是dom节点。它们不是主dom树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到dom树。在dom树中,文档片段被其所有的子元素所代替。因为文档片段存在于内存中,并不在dom树中,所以将子元素插入到文档片段时不会引起页面回流(对元素位置和几何上的计算)。因此,使用文档片段通常会带来更好的性能。

 

示例:创建主流web浏览器列表

html

<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/createdocumentfragment