Eu estava lendo sobre fragmentos de documentos e refluxo de DOM e me perguntei como document.createDocumentFragment
diferem, document.createElement
já que parece que nenhum deles existe no DOM até que eu os acrescente a um elemento DOM.
Fiz um teste (abaixo) e todos demoraram exatamente a mesma quantidade de tempo (cerca de 95ms). Acho que isso pode ser devido ao fato de não haver nenhum estilo aplicado a qualquer um dos elementos, portanto, talvez não haja refluxo.
Enfim, com base no exemplo abaixo, por que devo usar ao createDocumentFragment
invés de createElement
ao inserir no DOM e qual é a diferença entre os dois.
var htmz = "<ul>";
for (var i = 0; i < 2001; i++) {
htmz += '<li><a href="#">link ' + i + '</a></li>';
}
htmz += '<ul>';
//createDocumentFragment
console.time('first');
var div = document.createElement("div");
div.innerHTML = htmz;
var fragment = document.createDocumentFragment();
while (div.firstChild) {
fragment.appendChild(div.firstChild);
}
$('#first').append(fragment);
console.timeEnd('first');
//createElement
console.time('second');
var span = document.createElement("span");
span.innerHTML = htmz;
$('#second').append(span);
console.timeEnd('second');
//jQuery
console.time('third');
$('#third').append(htmz);
console.timeEnd('third');
fonte
createFragment
ecreateElement
na memória tem quase o mesmo efeito, pois ambos atualizaram o DOM em lote em vez de atualizar iterativamente várias vezes. Embora o principal benefício docreateFragment
seja oferecer a flexibilidade de escolher quaisquer elementos filho para anexar gratuitamente? Corrija-me se eu estiver errado.Outra diferença muito importante entre criar um elemento e um fragmento de documento:
Quando você cria um elemento e o anexa ao DOM, o elemento é anexado ao DOM, assim como aos filhos.
Com um fragmento de documento, apenas os filhos são anexados.
Veja o caso de:
que resulta neste HTML malformado (espaço em branco adicionado)
fonte