首先我們需要了解 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瀏覽器下面不會像其他瀏覽器下面 那樣檢測緩沖區是否已經有此圖片,有的話直接就觸發此事件。這個需要注意