了解DocumentFragment 給我們帶來的性能優化


首先我們需要了解 DocumentFragment 是什么?

w3c 上面的詳細解釋:link here 

 

我把關鍵點寫下來了:

DocumentFragment 節點不屬於文檔樹,繼承的 parentNode 屬性總是 null。

不過它有一種特殊的行為,該行為使得它非常有用,即當請求把一個 DocumentFragment 節點插入文檔樹時,插入的不是 DocumentFragment 自身,而是它的所有子孫節點。這使得 DocumentFragment 成了有用的占位符,暫時存放那些一次插入文檔的節點。它還有利於實現文檔的剪切、復制和粘貼操作

同時我們了解到當需要對頁面DOM進行操作的時候必然會導致多次 重繪、回流(什么是重繪,回流?)。這樣會加大頁面的負擔。影響頁面性能。因此我們可以創建這樣一個臨時占位符。進行操作以下是DEMO:

 

 

// Create the fragment
var fragment = document.createDocumentFragment();

//add DOM to fragment 

for(var i = 0; i < 10; i++) {
    var spanNode = document.createElement("span");
    spanNode.innerHTML = "number:" + i;
    fragment.appendChild(spanNode);
}

//add this DOM to body
document.body.appendChild(spanNode);

 

 

 

同時我覺得這里我們還可以進行衍生:比如我要獲取一個已知src的img的寬度和高度。如何做呢?

這里我就不引用DocumentFragment(這個應用場景沒有必要)。

var img = new Image();
img.onload = function() {
    alert(this.width + 'x' + this.height);
 
img = null;
}
img.src = 'http://images.blogjava.net/blogjava_net/bearrui/8_1.jpg';

這樣我們就可以獲得圖片的寬度和高度了。他們的原理都是一樣的即引入一個緩存dom來臨時存儲。

同時大家要注意一個問題。我之前發現有個問題 即我把 img.src = 'http://images.blogjava.net/blogjava_net/bearrui/8_1.jpg';放到onload 方法上面在ie下面就會有問題。當有img緩存的情況下onload不會觸發?為啥呢? 在IE瀏覽器下面不會像其他瀏覽器下面 那樣檢測緩沖區是否已經有此圖片,有的話直接就觸發此事件。這個需要注意

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM