나는 한 문서 조각에 대한 읽기 및 DOM 리플 로우 방법 궁금 document.createDocumentFragment
에서 차이가 document.createElement
나는 DOM 요소를 추가 할 때까지 둘 중이 DOM에 존재하지 않는 것처럼 보이는.
테스트 (아래)를했는데 모두 정확히 같은 시간 (약 95ms)이 걸렸습니다. 아마도 이것은 요소에 적용된 스타일이 없기 때문일 수 있으므로 리플 로우가 없을 수도 있습니다.
어쨌든 아래 예제를 기반으로 DOM에 삽입 할 때 createDocumentFragment
대신 사용해야 하는 이유 createElement
와 둘 사이의 차이점은 무엇입니까 ?
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');
답변
차이점은 문서 조각을 DOM에 추가 할 때 효과적으로 사라진다는 것입니다. 문서 조각을 삽입 한 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>