HTML의 구조나 내용 또는 스타일 등을 동적으로 조작하기 위해서는 해당 요소 노드를 취득해야 한다. 다양한 메소드를 통해 노드를 탐색하여 특정 요소 노드를 취득할 수 있다.
getElementById()
Document.prototype.getElementById
메소드를 통한 취득 방법. getElementById
메소드는 Document.prototype
의 프로퍼티이다. 따라서 문서 노드인 document를 통해 호출할 수 있다.
<!DOCTYPE html>
<html>
<body>
<ul>
<li id="two">First</li>
<li id="two">Second</li>
<li id="two">Third</li>
</ul>
<script>
const $elem = document.getElementById('two');
$elem.style.color = 'blue'
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<ul>
<li id="first">First</li>
<li id="second">Second</li>
<li id="third">Third</li>
</ul>
<script>
const $elem = document.getElementById('two'); // null
$elem.style.color = 'blue' // TypeError : Cannot read of properties of null
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<div id="bar"></div>
<script>
console.log(bar === document.getElementById('bar')); // true
delete bar;
// 전역 프로퍼티는 삭제되지만 전역 변수는 삭제 되지 않는다.
console.log(bar); // <div id="bar"></div>
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<div id="bar"></div>
<script>
let bar = 'hi';
// 이미 id 값과 동일한 이름으로 전역 변수가 선언 되어 있으므로 해당 전역 변수에 노드객체를 재할당하지 않는다.
console.log(bar); // 'hi'
</script>
</body>
</html>
getElementsByTagName()
getElementsByTagName
메서드가 인자로 전달받은 태그 이름을 가진 모든 요소 노드들을 탐색하여 유사 배열이자 이터러블인 HTMLCollection
객체에 담아 반환한다.getElementsByTagName
메서드에 *
를 인수로 넘기면 된다.Document.prototype.getElementsByTagName
→ 루트 노드인 document를 통해 호출하였으므로 전체 HTML 문서, 즉 DOM 전체에서 탐색한다.Element.prototype.getElementsByTagName
→ 특정 요소를 통해 호출하였으므로 해당 요소의 자식 요소 노드들을 탐색한다.HTMLCollection
객체를 반환getElementsByClassName()
getElementsByClassName
메서드가 인자로 전달받은 class 값을 가진 모든 요소 노드들을 탐색하여 유사 배열이면서 이터러블인 HTMLCollection
객체에 담아 반환한다.Document.prototype.getElementsByClassName
→ 루트 노드인 document를 통해 호출하였으므로 전체 HTML 문서, 즉 DOM 전체에서 탐색한다.Element.prototype.getElementsByClassName
→ 특정 요소를 통해 호출하였으므로 해당 요소의 자식 요소 노드들을 탐색한다.HTMLCollection
객체를 반환querySelector()
querySelectorAll()
NodeList
객체를 반환. NodeList
는 유사 배열이자 이터러블이다.NodeList
객체 반환*
을 넘겨준다.Document.prototype
프로퍼티의 querySelectorAll 메서드를 사용하면 HTML 문서 전체(DOM 전체)에서 노드 탐색하고, 특정 요소 노드를 통한 Element.prototype
프로퍼티의 메서드를 사용하면 해당 요소 노드의 자식 요소 노드들을 탐색한다.querySelector
가 더 구체적인 조건으로 노드를 선택할 수 있다.[0]
을 붙여야 한다. 이는 그리 보기 좋은 코드가 되지 못한다.
👉 id 요소 가져올때는 getElementById
를 사용하고, 그 외에는 querySelector
를 사용하는 것이 성능 측면에서는 조금 떨어질지몰라도 생산성, 편의성 측면에서 좋다.
Element.prototype.matches
메서드로 확인가능. 인수로 전달한 CSS 선택자로 요소 노드 취득 가능한지 확인할 수 있다.
...
<ul id="colors">
<li class="red">Red</li>
<li class="yellow">Yellow</li>
<li class="blue">Blue</li>
</ul>
...
<script>
const $yellow = document.querySelector('.yellow')
// $yellow 노드는 '#colors > li.yellow'로 취득할 수 있다.
console.log($yellow.matches('#colors > li.yellow') // true
// $yellow 노드는 '#colors > li.banana'로 취득할 수 없다.
console.log($yellow.matches('#colors > li.banana') //false
</script>
노드 객체의 상태 변화를 실시간으로 반영하는 live 객체
<html>
<body>
<ul>
<li class="red">First</li>
<li class="red">Second</li>
<li class="red">Third</li>
<ul>
<script>
const $elems = document.getElementsByClassName('red');
for(let i = 0; i < $elems.length; i++){
$elems[i].className = 'blue'
}
console.log($elems) // HTMLCollection(1) [li.red]
// 왜 이런 결과가 나오는가?
// 반복할 때마다 $elems가 변하기 때문
</script>
</body>
</html>
forEach
, map
등의 고차함수를 사용하는 것이다.실시간으로 노드 객체의 상태 변경을 반영하지 않는 non-live 객체. 단, childNodes 프로퍼티가 반환하는 NodeList 객체는 live 객체.
노드 탐색 프로퍼티는 참조만 가능한 읽기 전용 프로퍼티.
HTML문서에 스페이스, 탭, 엔터 키로 공백을 입력하면 공백 텍스트 노드가 생긴다.
자식 노드 존재 확인
Node.prototype
프로퍼티인 hasChildNodes()
메서드 사용하여 확인가능children.length
, childElementCount
Node.prototype.parentNode
프로퍼티로 탐색 가능
DOM 인터페이스 | 프로퍼티 | 설명 | 텍스트 노드 포함 유무 |
---|---|---|---|
Node.prototype | previousSibling | 형제 노드 중 자신의 이전 형제 노드 반환 | O |
Node.prototype | nextSibling | 형제 노드 중 자신 다음 형제 노드 반환 | O |
Element.prototype | previousElementSibling | 형제 노드 중 자신의 이전 형제 노드 반환 | X |
Element.prototype | nextElementSibling | 형제 노드 중 자신 다음 형제 노드 반환 | X |
노드 정보 프로퍼티도 참조만 가능한 읽기 전용 프로퍼티이다.
DOM 인터페이스 | 프로퍼티 | 설명 |
---|---|---|
Node.prototype | nodeType | 노드 타입을 나타내는 상수 반환 · 1 : Node.ELEMENT_NODE. 요소 노드 타입 · 3 : Node.TEXT_NODE. 텍스트 노드 타입 · 9: Node.DOCUMENT_NODE. 문서 노드 타입 |
Node.prototype | nodeName | 노드 이름을 문자열로 반환 - 요소 노드 : 태그 이름을 대문자 문자열로 반환. "UL", "LI", “DIV” - 텍스트 노드 : 문자열 #text 반환 - 문서 노드 : 문자열 #document 반환 |