DOM 외부에 경량화된 DOM 만들기 (DocumentFragment)
DocumentFragment 노드를 생성해서 사용하면 라이브 DOM 외부에 경량화된 문서 DOM을 만들 수 있습니다.
문서에 요소를 직접적으로 추가하면 브라우저가 그 때마다 페이지에 정보를 반영하고 렌더링 해야 하므로 DocumentFragment를 사용하여 라이브 DOM에 추가하는 것이 좋습니다.
실제 라이브 DOM에서 추가하는 것과의 차이점은 아래와 같습니다.
- 어떤 종류의 노드도 가질 수 있습니다.
- 라이브 DOM에 추가될 때, 복사되는 형태가 아닌 이전 되는 형태가 됩니다. 생성한 메모리 위치에 존재하지 않습니다.
라이브 DOM에 추가하기 1
ul 태그에 li 태그를 추가하여 번호를 출력하는 예제입니다.
<script>
var fragment = document.createDocumentFragment();
var ul = document.getElementById('myList');
var li = null;
for (var i = 0; i < 3; i++) {
li = document.createElement('li');
li.appendChild(document.createTextNode("Item = " + (i+1)))
fragment.appendChild(li);
}
ul.appendChild(fragment);
</script>
라이브 DOM에 추가하기 2
위 예제로 복잡한 DOM 구성을 추가하기에는 어려울 수 있습니다.
그래서 fragment에 div를 추가한다음, innerHTML 속성을 사용합니다.
<script>
var divElm = document.createElement('div');
var docFrag = document.createDocumentFragment();
docFrag.appendChild(divElm);
docFrag.querySelector('div').innerHTML = "<ul><li>Foo</li><li>Bar</li></ul>";
document.querySelector('div').appendChild(docFrag);
</script>
라이브 DOM에 복제하여 추가하기
위 예제들은 라이브 DOM에 이동되는 형태입니다.
하지만 cloneNode를 활용하여 메모리상에 유지할 수도 있습니다.
<script>
var ul = document.querySelector('ul');
var f = document.createDocumentFragment();
['apple','orange','banana'].forEach(function (e) {
var li = document.createElement('li');
li.textContent = e;
f.appendChild(li);
});
ul.appendChild(f.cloneNode(true));
</script>