千鋒長(zhǎng)沙前端培訓(xùn):性能優(yōu)化之文檔碎片分享
小伙伴們前端面試的時(shí)候經(jīng)常會(huì)被問(wèn)到關(guān)于性能優(yōu)化方面的問(wèn)題,那么千鋒長(zhǎng)沙前端培訓(xùn)這篇文章會(huì)詳細(xì)的解釋性能優(yōu)化解決方法之一“文檔碎片”:
一般情況下,在操作DOM結(jié)構(gòu)的時(shí)候,經(jīng)常會(huì)說(shuō)非常消耗性能,原因是我們向DOM中添加新的元素,DOM會(huì)立刻更新。也就是添加一次更新一次,如果添加100個(gè)節(jié)點(diǎn),那么就得更新100次,很浪費(fèi)資源呀
每次操作DOM節(jié)點(diǎn)插入時(shí),瀏覽器會(huì)觸發(fā)重排重繪,為了提高效率,要盡可能的減少重排重繪,即應(yīng)該減少DOM節(jié)點(diǎn)的插入。有一種方法就是利用文檔碎片去做。
文檔碎片是一種虛擬的DOM節(jié)點(diǎn),存在于內(nèi)存中,跟實(shí)際的DOM節(jié)點(diǎn)之間沒(méi)有關(guān)系,當(dāng)我們需要給一個(gè)節(jié)點(diǎn)中插入多個(gè)子節(jié)點(diǎn)的時(shí)候,完全可以將多個(gè)子節(jié)點(diǎn)先插入到文檔碎片中,所有子節(jié)點(diǎn)都放到文檔碎片中后,再將文檔碎片插入到實(shí)際的節(jié)點(diǎn)中,這樣就減少了很多節(jié)點(diǎn)直接插入到父節(jié)點(diǎn)中的次數(shù)了,也就是本來(lái)多次觸發(fā)重排重繪的操作,有了文檔碎片中,只需要觸發(fā)一次重排重繪了。文檔碎片創(chuàng)建:
document.createDocumentFragment()
這個(gè)方法返回一個(gè)文檔碎片,即虛擬DOM節(jié)點(diǎn)。
對(duì)于文檔碎片的插入操作,跟實(shí)際的DOM節(jié)點(diǎn)操作是一樣的。
例:
for(var i=1;i<=5;i++){
var p = document.createElement('p')
p.innerText = i
list.appendChild(p)
}
通過(guò)循環(huán)創(chuàng)建了5個(gè)p標(biāo)簽,每創(chuàng)建一個(gè)就將這個(gè)p標(biāo)簽。創(chuàng)建插入的節(jié)點(diǎn)較少時(shí),頁(yè)面會(huì)立馬發(fā)生變化。但一旦創(chuàng)建插入的節(jié)點(diǎn)多了以后,這個(gè)過(guò)程就可能會(huì)十分緩慢,例如插入10000條。
當(dāng)然也可以提前先創(chuàng)建一個(gè)空節(jié)點(diǎn),將所有子節(jié)點(diǎn)插入到這個(gè)節(jié)點(diǎn)中,然后再將這個(gè)節(jié)點(diǎn)插入到目標(biāo)節(jié)點(diǎn)中。
var oDiv = document.createElement('div');
for(var i=1;i<=10000;i++){
var p = document.createElement('p');
p.innerText = i;
oDiv.appendChild(p);
}
list.appendChild(oDiv);
但這樣會(huì)在list中多嵌套一個(gè)div標(biāo)簽。
而文檔碎片的意義跟這個(gè)div一樣,但不會(huì)多嵌套標(biāo)簽。
例:
var oFragmeng = document.createDocumentFragment();
for(var i=1;i<=10000;i++){
var p = document.createElement('p');
p.innerText = i;
oFragmeng.appendChild(p);
}
list.appendChild(oFragmeng);
經(jīng)過(guò)測(cè)試,在各個(gè)瀏覽器下性能明顯得到提高。

猜你喜歡LIKE
最新文章NEW
相關(guān)推薦HOT
更多>>熱門推薦
零基礎(chǔ)必看的前端HTML+CSS教程
沸Java培訓(xùn)新手實(shí)戰(zhàn)必備!單機(jī)版坦克大戰(zhàn)分步實(shí)現(xiàn)項(xiàng)目源碼
熱3種Javascript圖片預(yù)加載的方法詳解
熱長(zhǎng)沙前端培訓(xùn):一招教你用vue3+canvas實(shí)現(xiàn)坦克大戰(zhàn)
新互聯(lián)網(wǎng)涼了?參加長(zhǎng)沙Java培訓(xùn)能找到工作嗎?
長(zhǎng)沙Java培訓(xùn)實(shí)戰(zhàn)項(xiàng)目,出游咨詢訂票系統(tǒng)開發(fā)流程
不參加長(zhǎng)沙Java培訓(xùn)能學(xué)會(huì)Java嗎?2022Java技能學(xué)習(xí)路線圖
千鋒長(zhǎng)沙Java培訓(xùn)分享之怎么學(xué)習(xí)Java集合?
千鋒長(zhǎng)沙前端培訓(xùn)分享之JavaScript面向?qū)ο缶幊趟枷朐斀?/p>
千鋒長(zhǎng)沙前端培訓(xùn)分享之web前端的回流和重繪
千鋒長(zhǎng)沙前端培訓(xùn)分享之3種Javascript圖片預(yù)加載的方法詳解
千鋒長(zhǎng)沙前端培訓(xùn)分享之利用Jest測(cè)試React組件
千鋒長(zhǎng)沙前端培訓(xùn)分享之JavaScript中Slice的用例
千鋒長(zhǎng)沙java培訓(xùn)分享之Socket編程
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開班地區(qū)
查看來(lái)校路線