DOM을 제거하는 과정 : removeChild()
<div id="A">Hi</div>;
<div id="B">Dude</div>;
//script
var divA = document.getElementById("A");
divA.parentNode.removeChild(divA);
// divB는 textNode를 가르킴.
// removeChild를 제거하면 <div id="B">만 남게됨
var divB = document.getElementById("B").firstChild;
divB.parentNode.removeChild(divB);
노드를 제거하는 대신 업데이트 : replaceChild()
<div id="A">Hi</div>;
<div id="B">Dude</div>;
//script
var divA = document.getElementById("A");
var newSpan = document.createElement("span");
// div 대신 <span>Howdy</span>으로 업데이트
newSpan.textContent = "Howdy";
divA.parentNode.replaceChild(newSpan, divA);
cloneNode() 메서드를 사용하여 단일 노드 혹은 모든 자식 노드를 복제할 수 있다.
<ul>
<li>2</li>
<li>3</li>
</ul>;
// cloneUL 은 <ul> 껍데기만 복사한다.
var cloneUL = document.querySelector("ul").cloneNode();
<ul>
<li>2</li>
<li>3</li>
</ul>;
// 매개변수 true 전달, 자식 노드 모두 복사
var cloneUL = document.querySelector("ul").cloneNode(true);
이벤트로 인한 추가된 것은 복제되지 않는다.
childNodes 속성을 사용하면 직계 자식 노드에 대해 배열 형태의 리스트가 나온다.
<ul>
<li>2</li>
<li>3</li>
</ul>;
var ulElementChildNodes = document.querySelector("ul").childNodes;
// 결과 : NodeList(5) : 0 : text, 1 : li : <li>2</li>
// 2 : text, 3 : <li>3</li>, 4: text
element 노드 뿐 아니라 Text, Comment 노드도 포함된다.
Array.isArray(document.querySelectorAll('a')) // false
// call로 진짜 배열을 반환해 true 값을 가진다.
Array.isArray(Array.prototype.slice.call(document.querySelectorAll("a")));
노드 참조 (document.querySelector('ul'))에 다음과 같은 속성들을 사용하여 DOM을 탐색하여 다른 노드에 대한 참조를 얻을 수 있다.
<body>
<ul>
<!-- comment -->
<li>2</li>
<li>3</li>
</ul>
</body>;
var ul = document.querySelector("ul");
ul.parentNode.nodeName; // body
ul.firstChild.nodeName; // li가 아닌 comment가 출력
text와 comment 노드를 무시하고 DOM을 탐색하고 싶을 때
<body>
<ul>
<li>2</li>
<li>3</li>
</ul>
</body>;
var ul = document.querySelector("ul");
ul.firstElementChild.nodeName; // comment 대신 li
// html 안에 body가 있는지 확인.
// inside : true
ver inside = document.querySelector('html').contains(document.querySelector('body'));
동일한 경우인지 판단하는 기준
isEqualNode() 메서드를 호출해서 알 수 있다. true / false
// 동일 상태
<input type="text">
<input type="text">
// 동일하지 않은 상태 ( 자식 노드 )
<textarea>foo</textarea>
<textarea>bar</textarea>
var input = document.querySelectorAll('input');
input[0].isEqualNode(input[1]) // 완전 동일한 상태. true
완전히 동일한 것이 아니라 동일한 노드를 참조하고 있는지 확인하려면 '===' 연산자를 이용하여 확인할 수 있다.
document.body === document.body