(web前端)DOM优化的暂时11中方法

234 阅读3分钟

1、减少DOM与js语法的多次交互。

如: 插入5000 个a 进入到 div1 中。 如一边循环,一边+= innerHTML 的话,就算是多次产生过桥费,数据交互过多。 那么如果先定义一个 变量,等5000 次 循环完之后 在插入到 div1 结构里面的话,那么等于就过桥了一次,这样会大大的减少交互的时间,减轻服务器的承受。

这是多次操作DOM的。

<script>
let ul1 = document.querySelector('#ul1');
   console.time('yc');
   for(let i =0;i<5000;i++){
      ul1.innerHTML += '<li></li>'
   }
   console.timeEnd('yc')
 </script>
 

同样的,下面的例子是先创建了一个变量,测试完性能上大大提升,有兴趣的可以根据代码去测试下。


<script>
   let ul1 = document.querySelector('#ul1');
   let sliHtml = '';
   console.time('yc');
   for (let i = 0;i<5000;i++){
       sliHtml+='<li></li>'
   }
   ul1.innerHTML = sliHtml;
   console.timeEnd('yc')
</script>

2、 根据用户情况选择是否用DOM方法,还是 innerHTML。

经过测试,谷歌内核的偏向于DOM方法的用时少, ie 、火狐等内核的浏览器,会对innerHTML 操作DOM结构的用时会少。

所以要根据公司分析,来决定用那种方法来操作DOM结构。


<script>
    let ul1 = document.querySelector('#ul1');
    //先用DOM方法去插入元素
    console.time('yc');
    for (let i=0;i<5000;i++){
        let liHtml = document.createElement('li');
        ul1.appendChild(liHtml);
    }
    console.timeEnd('yc');

    //下面是用innerHTML去直接插入内容

let sliHtml = '';
    console.time('yc');
    for (let i = 0;i<5000;i++){
        sliHtml+='<li></li>'
    }
    ul1.innerHTML = sliHtml;
    console.timeEnd('yc')

</script>

3、克隆节点,因为创建一个节点,进行复制,会比多次创建节点好。


//  创建一个节点,用克隆的方法去做
console.time('yc');
 let liHtml = document.createElement('li');
liHtml.innerHTML = 'li';
 for(let i = 0;i<5000;i++){
     let NewLiHtml = liHtml.cloneNode(true);
     ul1.appendChild(NewLiHtml)
 }
console.timeEnd('yc');

4、局部变量的方法,

如:循环时候的 length,提前声明一个局部变量,会提升一些性能,提升的不会太高,但是积少成多,也会影响到一些性能。

//  如1:
let len = liHtml.length;
    for(let i = 0;i<len;i++){
        ``````
    }
    
//  如2:    
 let doc = document;
  let oDiv = doc.getElementsByTagName('div')

5、尽量使用新的获取元素的方法,如querySelector、querySelectorAll 去选择元素。


let ul1 = document.querySelector('#ul1');

6、在插入节点前,将节点内的内容先填入好,在appendChilden 进去,性能上会有大大的提升。

7、添加样式利用 cssText 的方法,统一添加。

8、缓存布局信息。 如先把元素的位置用变量存起来,然后去操作这个变量的参数。

9、文档碎片整理。 这个相当于买了5000个 火腿肠,你每一次拿一根回家,然后在去超市拿一根,回家,然后在回去,就这样跑了5000次。 那么用createDocumentFragment()的方法,就相当于你买了一个袋子,一下把5000个火腿肠装起来,一次性的拿回家。

10、 事件委托。详情待定。

11、逻辑和视图分离。

利用jq 的 tmpl()的模板。详情待定。

先整理下方法,后期陆续将测试案例代码 写上来。