Consider these three versions of appending li
s to a ul
:
Naive Version (20% slower):
var ul = document.getElementById('targetUl');
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
ul.appendChild(li);
}
Using a JavaScript Fragment (4% slower):
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);
Appending to an element not yet in the DOM (1.26% faster):
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);
Why is appending to a DOM element held in memory faster than appending to a Fragment
? Since fragment
was created for this sole purpose shouldn't it be faster? Are they're any advantages to using a fragment
over an element held in memory other than not having to include a top level element before appending?
Check the test output from jsperf: http://jsperf.com/javascript-fragments-tests