I został czytania o fragmenty dokumentów i DOM reflow i zastanawiał się, jak document.createDocumentFragment
różni się od document.createElement
, jak to wygląda jak żadna z nich nie istnieje w DOM aż dołączyć je do elementu DOM.
Zrobiłem test (poniżej) i wszystkie z nich zajęły dokładnie tyle samo czasu (około 95 ms). Przypuszczalnie może to być spowodowane tym, że żaden z elementów nie został zastosowany w stylu, więc może nie było ponownego przepływu.
W każdym razie, w oparciu o poniższy przykład, dlaczego powinienem używać createDocumentFragment
zamiast createElement
wstawiania do DOM i jaka jest różnica między nimi.
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');
źródło
createFragment
icreateElement
przechowywanie w pamięci, ma mniej więcej taki sam efekt, jak oba zbiorcze aktualizowanie modelu DOM zamiast wielokrotnej iteracyjnej aktualizacji. Chociaż główną zaletą programucreateFragment
jest to, że zapewnia elastyczność wyboru elementów podrzędnych do bezpłatnego dołączenia? Popraw mnie, jeśli się myliłem.Kolejna bardzo ważna różnica między tworzeniem elementu a fragmentem dokumentu:
Kiedy tworzysz element i dołączasz go do DOM, element jest dołączany do DOM, podobnie jak elementy podrzędne.
Do fragmentu dokumentu dołączane są tylko dzieci.
Weźmy przykład:
co skutkuje tym zniekształconym kodem HTML (dodano spacje)
źródło