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>에서 해당 셀이 몇 번째인지를 나타내는 숫자를 반환한다.