인수로 전달한 id 값을 갖는 하나의 요소 노드를 탐색하여 반환
document.getElementById('id값');
예시
<!DOCTYPE html>
<html>
<body>
<ul>
<li id="apple">Apple</li>
<li id="banana">Banana</li>
<li id="orange">Orange</li>
</ul>
<script>
// id값이 'banana'인 요소 노드를 탐색하여 반환
let banana = document.getElementById('banana');
</script>
</body>
</html>
document.getElementsByTagName('태그명');
예시
<!DOCTYPE html>
<html>
<body>
<ul>
<li id="apple">Apple</li>
<li id="banana">Banana</li>
<li id="orange">Orange</li>
</ul>
<script>
// 태그 이름이 li인 요소 노드를 모두 탐색하여 반환
// 탐색된 요소 노드들은 HTMLCollection 객체에 담겨 반환된다
// HTMLCollection 객체 -> 유사 배열 객체
let li = document.getElementsByTagName('li');
console.log(li); // HTMLCollection(3)...
console.log(li[0].innerHTML); // Apple
</script>
</body>
</html>
document.getElementsByClassName('class값');
예시
<!DOCTYPE html>
<html>
<body>
<ul>
<li class="fruit apple">Apple</li>
<li class="fruit banana">Banana</li>
<li class="fruit orange">Orange</li>
</ul>
<div class="banana">Banana</div>
<script>
// class 값이 'fruit'인 요소 노드를 모두 탐색하여 반환
// 탐색된 요소 노드들은 HTMLCollection 객체에 담겨 반환된다
let fruit = document.getElementsByClassName('fruit');
let bananaFromDocument = document.getElementsByClassName('banana');
let bananaFromFruit = fruit.getElementsByClassName('banana');
console.log(bananaFromDocument);
// HTMLCollection(2) [li.banana, div.banana]
console.log(bananaFromFruit);
// HTMLCollection [li.banana]
</script>
</body>
</html>
document.querySelector('');
document.querySelectorAll('');
// 여러 개의 요소 노드 객체를 갖는 NodeList 객체 반환 -> 유사 배열 객체
예시
<!DOCTYPE html>
<html>
<body>
<ul>
<li class="apple">Apple</li>
<li class="banana">Banana</li>
<li class="orange">Orange</li>
</ul>
<script>
// class 어트리뷰트 값이 'banana'인 첫 번째 요소 노드를 탐색하여 반환
let banana = document.querySelector('.banana');
// ul요소의 자식 요소인 li요소를 모두 탐색하여 반환
let fruit = document.querySelectorAll('ul > li');
console.log(fruit);
// NodeList(3) [li.apple, li.banana, li.orange]
</script>
</body>
</html>
인수로 전달한 CSS 선택자를 통해 특정 요소 노드를 취득할 수 있는지 확인
element.matches('');
예시
<!DOCTYPE html>
<html>
<body>
<ul id="fruit">
<li class="apple">Apple</li>
<li class="banana">Banana</li>
<li class="orange">Orange</li>
</ul>
<script>
let apple = document.querySelector('.apple');
// apple 노드는 '#fruit > li.apple'로 취득할 수 있다
console.log(apple.matches('#fruit > li.apple')); // true
// apple 노드는 '#fruit > li.banana'로 취득할 수 없다
console.log(apple.matches('#fruit > li.banana')); // false
</script>
</body>
</html>
: 새로운 노드를 생성하여 DOM에 추가하거나 기존 노드를 삭제 또는 교체하는 것
요소 노드의 HTML 마크업을 취득하거나 변경
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello <span>World!</span></div>
</body>
<script>
// #foo 요소의 콘텐츠 영역 내의 HTML 마크업을 문자열로 취득한다.
console.log(document.getElementById('foo').innerHTML);
// "Hello <span>World!</span>"
// HTML 마크업이 파싱되어 요소 노드의 자식 노드로 DOM에 반영된다.
let foo = document.getElementById('foo');
foo.innerHTML = 'Hi <span>there!</span>';
// 노드 삭제
foo.innerHTML = '';
</script>
</html>
*innerText
: Element의 속성으로 element 내에서 사용자에게 보여지는 text값들을 가져오거나 설정할 수 있다
요소 노드 생성
: createElement(tagname)
텍스트 노드 생성
: createTextNode(text)
텍스트 노드를 요소 노드의 자식 노드로 추가 , 요소 노드를 DOM에 추가
: appendChild(childNode)
// 1. 요소 노드 생성
const $li = document.createElement('li');
// 생성된 요소 노드는 아무런 자식 노드가 없다
console.log(li.childNodes); // NodeList []
// 2. 텍스트 노드 생성
const textNode = document.createTextNode('banana');
// 3. 텍스트 노드를 li요소 노드의 자식 노드로 추가
$li.appendChild(textNode);
// 4. $li요소 노드를 #fruits 요소 노드의 마지막 자식 노드로 추가
$fruits.appendChild($li);
DocumentFragment
노드를 사용하는 것이 효율적
DocumentFragment
노드
- 기존 DOM과 별도로 존재하므로 기존DOM에는 어떠한 변경도 발생하지 않는다.
DocumentFragment
노드를 DOM에 추가하면 자신은 제거되고 자신의 자식 노드만 추가된다.
<!DOCTYPE html>
<html>
<body>
<ul id="fruits"></ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// DocumentFragment 노드 생성
const $fragment = document.createDocumentFragment();
['Apple', 'Banana', 'Orange'].forEach(text => {
// 1. 요소 노드 생성
const $li = document.createElement('li');
// 2. 텍스트 노드 생성
const textNode = document.createTextNode(text);
// 3. 텍스트 노드를 $li 요소 노드의 자식 노드로 추가
$li.appendChild(textNode);
// 4. $li 요소 노드를 DocumentFragment 노드의 마지막 자식 노드로 추가
$fragment.appendChild($li);
// 5. DocumentFragment 노드를 #fruits 요소 노드의 마지막 자식 노드로 추가
$fragment.appendChild($container);
});
</script>
</html>
Node.prototype.childNodes
: 자식 노드를 모두 탐색하여 반환
Element.prototype.children
: 자식 노드 중 요소 노드만 모두 탐색하여 반환
Node.prototype.firstChild
: 첫번째 자식 노드 반환
Node.prototype.lastChild
: 마지막 자식 노드 반환
Element.prototype.firstElementChild
: 첫번째 자식 요소 노드 반환
Element.prototype.lastElementChild
: 마지막 자식 요소 노드 반환
예시
<!DOCTYPE html>
<html>
<body>
<ul id="fruit">
<li class="apple">Apple</li>
<li class="banana">Banana</li>
<li class="orange">Orange</li>
</ul>
<script>
// 노드 탐색의 기점이 되는 #fruit 요소 노드를 취득
const $fruit = document.getElementById('fruit');
// #fruit 요소의 모든 자식 노드 탐색
// 요소 노드 뿐만 아니라 텍스트 노드도 포함
console.log($fruit.childNodes);
// -> NodeList(7) [text, li.apple, text, li.banana, text, li.orange, text]
// #fruit 요소의 모든 자식 노드 탐색
console.log($fruit.children);
// -> HTMLCollection(3) [li.apple, li.banana, li.orange]
// #fruit 요소의 첫 번째 자식 노드 탐색
console.log($fruit.firstChild); // #text
// #fruit 요소의 마지막 자식 노드 탐색
console.log($fruit.lastChild); // #text
// #fruit 요소의 첫 번째 자식 노드 탐색
console.log($fruit.firstElementChild); // li.apple
// #fruit 요소의 마지막 자식 노드 탐색
console.log($fruit.lastElementChild); // li.orange
</script>
</body>
</html>
자식 노드 존재 확인
Node.prototype.hasChildrenNodes
: 존재하면 true
, 존재하지 않으면 false
부모 노드 탐색
Node.prototype.parentNode
형제 노드 탐색
Node.prototype.previousSibling
: 이전 형제 노드를 탐색하여 반환
Node.prototype.nextSibling
: 다음 형제 노드를 탐색하여 반환
Element.prototype.previousElementSibling
: 이전 형제 요소 노드 반환
Element.prototype.nextElementSibling
: 다음 형제 요소 노드 반환
Node.prototype.nodeType
: 노드 객체의 종류. 노드 타입을 나타내는 상수를 반환
1
반환3
반환9
반환Node.prototype.nodeName
: 노드 이름을 문자열로 반환
#text
반환#document
반환nodeValue
: 노드 객체의 값(= 텍스트 노드의 텍스트)을 반환
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello</div>
</body>
<script>
// 문서 노드의 nodeValue 프로퍼티를 참조
console.log(document.nodeValue); // null
// 요소 노드의 nodeValue 프로퍼티를 참조
const $foo = document.getElementById('foo');
console.log($foo.nodeValue); // null
// 텍스트 노드의 nodeValue 프로퍼티를 참조
const $textNode = $foo.firstChild;
console.log($textNode.nodeValue); // Hello
// 텍스트 노드의 값 변경
$textNode.nodeValue = 'World';
console.log($textNode.nodeValue); // World
</script>
</html>
textContent
: 요소 노드의 텍스트와 모든 자손 노드의 텍스트를 모두 취득하거나 변경
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello <span>World!</span></div>
</body>
<script>
// #foo 요소 노드의 텍스트를 모두 취득한다. HTML 마크업은 무시
console.log(document.getElementById('foo').textContent); // Hello World!
</script>
</html>
만약 요소 노드의 콘텐츠 영역에 자식 요소 노드가 없고 텍스트만 존재한다면
firstChild.nodeValue
와textContent
프로퍼티는 같은 결과를 반환하므로,
이 경우textContent
를 사용하는 편이 더 간단하다.
innerText
와 유사하지만,innerText
는 사용하지 않는 것이 좋다