Должен ли я использовать документ.createDocumentFragment или документ.метод createElement
Я чтение фрагментов документов а дом рефлоу и удивлялся как document.createDocumentFragment
отличается от document.createElement
поскольку похоже, что ни один из них не существует в DOM, пока я не добавлю их к элементу DOM.
Я сделал тест (ниже), и все они заняли ровно столько же времени (около 95 МС). По предположению, это может быть связано с тем, что стиль не применяется ни к одному из элементов, поэтому, возможно, нет оплавления.
в любом случае, на основе приведенного ниже примера, почему я должен использовать createDocumentFragment
вместо createElement
при вставке в DOM и что разница между ними.
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');
2 ответа:
разница в том, что фрагмент документа эффективно исчезает при добавлении его в дом. Что происходит, так это то, что все дочерние узлы фрагмента документа вставляются в том месте в DOM, где вы вставляете фрагмент документа, а сам фрагмент документа не вставляется. Сам фрагмент продолжает существовать, но теперь у него нет детей.
Это позволяет вставлять несколько узлов в DOM одновременно:
var frag = document.createDocumentFragment(); var textNode = frag.appendChild(document.createTextNode("Some text")); var br = frag.appendChild(document.createElement("br")); var body = document.body; body.appendChild(frag); alert(body.lastChild.tagName); // "BR" alert(body.lastChild.previousSibling.data); // "Some text" alert(frag.hasChildNodes()); // false
еще одно очень важное различие между созданием элемента и фрагмента документа:
когда вы создаете элемент и добавляете его к DOM, элемент добавляется к DOM, а также к дочерним элементам.
С фрагментом документа, добавляются только дети.
рассмотрим пример:
var ul = document.getElementById("ul_test"); // First. add a document fragment: (function() { var frag = document.createDocumentFragment(); var li = document.createElement("li"); li.appendChild(document.createTextNode("Document Fragment")); frag.appendChild(li); ul.appendChild(frag); console.log(2); }()); (function() { var div = document.createElement("div"); var li = document.createElement("li"); li.appendChild(document.createTextNode("Inside Div")); div.appendChild(li); ul.appendChild(div); }());
Sample List: <ul id="ul_test"></ul>
что приводит к этому искаженному HTML (добавлены пробелы)
<ul id="ul_test"> <li>Document Fragment</li> <div><li>Inside Div</li></div> </ul>