性能優(yōu)化之dom操作篇

一、需求一

將數(shù)組['Firefox', 'Chrome', 'Opera', 'Safari', 'Internet Explorer'] 展示到頁(yè)面<div class='list-box'></div>;

  • 最慢做法
const listData = ['Firefox', 'Chrome', 'Opera', 'Safari', 'Internet Explorer'];
listData.forEach((value)=>{
 const pNode = document.createElement("p");
 pNode.innerText = value;
 document.querySelector('.list-box').appendChild(liNode);
})

優(yōu)化

1. 緩存dom對(duì)象

解決缺點(diǎn): 每一次循環(huán)都會(huì)去查找為list-box的元素,效率自然非常低,所以我們需要將元素在循環(huán)前查詢完畢,在循環(huán)中僅僅是引用就行了:

const listData = ['Firefox', 'Chrome', 'Opera', 'Safari', 'Internet Explorer'];
const listBoxEle = document.querySelector('.list-box');
listData.forEach((value)=>{
 const pNode = document.createElement("p");
 pNode.textContent = value;
 listBoxEle.appendChild(liNode);
})

在一般情況下,我們會(huì)根據(jù)需要,將一些頻繁被查找的元素緩存起來(lái),在查找它或查找它的子孫元素時(shí),以它為起點(diǎn)進(jìn)行查找,就能提高查找效率了。

2. 一次性DOM節(jié)點(diǎn)生成
const listData = ['Firefox', 'Chrome', 'Opera', 'Safari', 'Internet Explorer'];
const listBoxEle = document.querySelector('.list-box');
const listNode = []
listData.forEach((value)=>{
  listNode.push(`<p>${value}</p>`)
})
listBoxEle.innerHTML = listNode;
3. 在內(nèi)存中操作元素(文檔片段 DocumentFragment)
const listBoxEle = document.querySelector('.list-box');
const fragment = document.createDocumentFragment();
const listData = ['Firefox', 'Chrome', 'Opera', 
    'Safari', 'Internet Explorer'];

listData.forEach(function(value) {
    const pNode = document.createElement('p');
    pNode.textContent = value;
    fragment.appendChild(pNode);
});

listBoxEle.appendChild(fragment);

因?yàn)槲臋n片段存在于內(nèi)存中,并不在DOM樹(shù)中,所以將子元素插入到文檔片段時(shí)不會(huì)引起頁(yè)面回流(對(duì)元素位置和幾何上的計(jì)算)。因此,使用文檔片段通常會(huì)帶來(lái)更好的性能。

二、需求二

需要通過(guò)JavaScript給元素增加樣式
比如如下代碼:

element.style.fontSize = '24px';
element.style.color = 'white';

這樣效率很低,每次修改style屬性后都會(huì)觸發(fā)元素的重繪,如果修改了的屬性涉及大小和位置,將會(huì)導(dǎo)致回流。所以我們應(yīng)當(dāng)盡量避免多次為一個(gè)元素設(shè)置style屬性,應(yīng)當(dāng)通過(guò)給其添加新的CSS類,來(lái)修改其CSS

優(yōu)化: 通過(guò)類修改樣式

.element {
    font-size: 24px;
    color: #fff;
}
element.className += " element";

三、事件監(jiān)聽(tīng)優(yōu)化

通過(guò)事件代理批量操作事件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于前端性能優(yōu)化問(wèn)題詳解 出處:http://segmentfault.com/blogs 前端性能優(yōu)化指南 AJ...
    bennnnn閱讀 1,722評(píng)論 2 4
  • ??DOM 1 級(jí)主要定義的是 HTML 和 XML 文檔的底層結(jié)構(gòu)。 ??DOM2 和 DOM3 級(jí)則在這個(gè)結(jié)構(gòu)...
    霜天曉閱讀 1,611評(píng)論 1 3
  • ??DOM(文檔對(duì)象模型)是針對(duì) HTML 和 XML 文檔的一個(gè) API(應(yīng)用程序編程接口)。 ??DOM 描繪...
    霜天曉閱讀 3,877評(píng)論 0 7
  • 第一章 1.什么是DOM DOM: Document Object Model(文檔對(duì)象模型) 是JavaScri...
    fastwe閱讀 888評(píng)論 0 0
  • AJax 優(yōu)化 緩存 Ajax 請(qǐng)求盡量使用GET, 僅取決于cookie數(shù)量 Cookie 優(yōu)化 減少Cooki...
    KeKeMars閱讀 9,477評(píng)論 5 89

友情鏈接更多精彩內(nèi)容