考慮追加li
s到一個ul
這些三個版本:爲什麼追加到尚未在DOM中的元素比使用JavaScript片段更快?
樸素版(20慢%):
var ul = document.getElementById('targetUl');
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
ul.appendChild(li);
}
使用JavaScript片段(較慢4%):
var ul = document.getElementById('targetUl'),
fragment = document.createDocumentFragment();
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
fragment.appendChild(li);
}
ul.appendChild(fragment);
附加到尚未在DOM中的元素(1.26%更快):
var ul = document.createElement('ul'),
div = document.getElementById('targetDiv');
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
ul.appendChild(li);
}
div.appendChild(ul);
爲什麼追加到保存在內存中的DOM元素比追加到Fragment
更快?由於fragment
是爲了這個唯一目的而創建的,它不應該更快嗎?在追加內容之前,如果使用fragment
而不是在頂層元素中包含頂點元素,那麼它們對於使用內存中的元素使用fragment
有什麼好處?
檢查從jsperf輸出測試:http://jsperf.com/javascript-fragments-tests
沒有參考底層代碼或設計,無論你得到的答案是猜測。 Mine是一個片段是任何DOM元素的通用容器,而UL是非常具體的,只能有LI子元素,所以有一個片段必須在元素被附加時做,UL不。我認爲±4%不顯着。 – RobG
不要太擔心微觀優化 –
什麼會使碎片更快? (假設在片段和常規DOM元素中可以做什麼優化) – JKillian