Document 객체는 웹페이지를 의미한다. 웹페이지에 존재하는 HTML요소에 접근하려면 Document 객체부터 시작해야한다.
document 객체는 페이지의 기본 ‘진입점’ 역할을 하고, document 객체를 이용해 페이지 내의 모든 요소를 변경할 수 있다.
html 요소와 관련된 작업을 도와주는 다양한 메소드를 제공한다.
document.getElementByID()
document.getElementByClassName()
document.getElementByName() // 해당 name 속성값을 가지는 요소를 선택
document.createElement('body')
document.write() // html 출력 스트림을 통해 텍스트를 출력
요소.onclick = function(){} // 마우스 클릭 이벤트에 이벤트 핸들러를 연결
html dom에서 정보를 저장하는 계층적 단위.
노드 트리는 노드들의 집합으로, 노드 간의 관계를 나타낸다.
자바스크립트는 html dom 을 이용해 노드 트리에 포함된 모든 노드에 접근할 수 있다.
노드 트리의 모든 노드는 서로 계층적 관계를 맺고 있다.
nodeName(이름), nodeValue(값), nodeType(타입) 프로퍼티로 접근할 수 있다.
DOM 트리 상단의 노드들은 document가 제공하는 프로퍼티를 사용해 접근할 수 있다.
<html>
= document.documentElement
<body>
= document.body
<head>
= document.head
childNodes
컬렉션은 텍스트 노드를 포함한 모든 자식 노드를 담고 있다.firstChild
첫 번째 자식 노드에 빠르게 접근할 수 있다.lastChild
마지막 자식 노드에 빠르게 접근할 수 있다.childNodes
는 마치 배열 같아 보이지만 배열이 아닌 반복가능한 유사 배열 객체인 컬렉션(collection)이다. 따라서 아래와 같은 특징을 가진다.for .. of
를 사용할 수 있다.
배열이 아니기 때문에 배열 메서드를 쓸 수 없다. 배열 메서드를 적용하고 싶다면 Array.from 을 적용해야 한다.
alert( Array.from(document.body.childNodes).filter ); // function
같은 부모를 가진 노드를 형제 노드라고 한다.
이전 형제 노드에 대한 정보는 previousSibling
에서,
다음 형제 노드에 대한 정보는 nextSibling
에서 찾을 수 있다.
부모 노드에 대한 정보는 parentNode
를 이용해 참조할 수 있다.
실무에서는 웹 페이지를 구성하는 태그의 분신인 ‘요소 노드'를 조작하는 작업이 대다수이다.
요소 노드를 탐색하기 위한 프로퍼티는 다음과 같다.
children
해당 요소의 자식 노드 중 요소 노드만을 가리킨다.firstElementChild
와 lastElementChild
프로퍼티는 각각 첫 번째 자식 요소 노드와 마지막 자식 요소 노드를 가리킨다.previousElementSibling
과 nextElementSibling
은 형제 요소 노드를 가리킨다.parentElement
는 부모 요소 노드를 가리킨다.parentElement 프로퍼티는 부모노드 중 ‘요소 노드'를 반환하고,
parentNode 프로퍼티는 모든 부모 노드를 반환한다.
대부분의 경우 두 프로퍼티는 같은 노드를 반환하지만, 아래와 같은 예외도 있다.
document.documentElement.parentNode // document
document.documentElement.parentElement // null
<html>
에 해당하는 document.documentElement
의 부모는 document 인데, document 는 요소 노드가 아니기 때문에 parentElement 는 null 을 반환한다.
일부 DOM 요소는 편의를 위해 기본 프로퍼티 외에 추가적인 프로퍼티를 지원하는데, 대표적으로 테이블이 있다.
요소는 기본 프로퍼티 이외에 다음 프로퍼티들을 지원한다.
table.rows
는 <tr>
요소를 담은 컬렉션을 참조한다.<thead>
, <tfoot>
, <tbody>
요소 또한 rows 프로퍼티를 지원한다.table.caption/tHead/tFoot
은 각각 <caption>
, <thead>
, <tfoot>
요소를 참조한다.table.tBodies
는 <tbody>
요소를 담은 컬렉션을 참조한다. 표준에 따르면, 테이블 내에 여러 개의 <tbody>
가 존재하는 게 가능한데, 최소한 하나는 무조건 있어야 한다. HTML 문서에는 <tbody>
가 없더라도 브라우저는 <tbody>
노드를 DOM에 자동으로 추가한다.<tr>
요소는 다음 프로퍼티를 지원한다.
tr.cells
는 주어진 <tr>
안의 모든 <td>
, <th>
을 담은 컬렉션을 반환한다.tr.sectionRowIndex
는 주어진 <tr>
이 <thead>/<tbody>/<tfoot>
안쪽에서 몇 번째 줄에 위치하는지를 나타내는 인덱스를 반환한다.tr.rowIndex
는 <table>
내에서 해당 <tr>
이 몇 번째 줄인 지를 나타내는 숫자를 반환한다.<td>
와 <th>
요소는 다음 프로퍼티를 지원한다.
td.cellIndex
는 <td>
나 <th>
가 속한 <tr>
에서 해당 셀이 몇 번째인지를 나타내는 숫자를 반환한다.