문서 객체 모델(The Document Object Model, 이하 DOM) 은 HTML, XML 문서의 프로그래밍 interface 이다. DOM은 문서의 구조화된 표현(structured representation)을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하여 그들이 문서 구조, 스타일, 내용 등을 변경할 수 있게 돕는다. DOM 은 nodes와 objects로 문서를 표현한다. 이들은 웹 페이지를 스크립트 또는 프로그래밍 언어들에서 사용될 수 있게 연결시켜주는 역할을 담당한다.
<div class="parent">
<div class="children"></div>
</div>
문서 노드
문서 노드는 DOM 트리의 최상위에 존재하는 루트 노드로서 document
객체를 가리킨다. 따라서 문서 노드는 window.document
또는 document
로 참조할 수 있다. 문서 노드, 즉 document
객체는 DOM 트리의 루트 노드이므로 DOM 트리의 노드들에 접근하기 위한 진입점 역할을 담당한다.
요소 노드
요소 노드는 HTML 요소를 가리키는 객체다. 요소 노드는 HTML 요소 간의 중첩에 의해 부자 관계를 가지며, 이 부자 관계를 통해 정보를 구조화한다. 따라서 요소 노드는 문서의 구조를 표현한다고 할 수 있다.
어트리뷰트 노드
어트리뷰트 노드는 HTML 요소의 어트리뷰트를 가리키는 객체다. 어트리뷰트 노드는 부모 노드와 연결되어 있지 않고 요소 노드에만 연결되어 있다. 따라서 어트리뷰트 노드에 접근하여 어트리뷰트를 참조하거나 변경하려면 먼저 요소 노드에 접근해야 한다.
텍스트 노드
텍스트 노드는 HTML 요소의 텍스트를 가리키는 객체다. 요소 노드가 문서의 구조를 표현한다면 텍스트 노드는 문서의 정보를 표현한다고 할 수 있다. 텍스트 노드는 요소 노드의 자식 노드이며, DOM 트리의 최종단이다. 따라서 텍스트 노드에 접근하려면 먼저 부모 노드인 요소 노드에 접근해야 한다.
Document.prototype.getElementById
Document.prototype/Element.prototype.getElementsByTagName
Document.prototype/Element.prototype.getElementsByClassName
Document.prototype/Element.prototype.querySelector
Element.prototype.matches
DOM API가 여러 개의 결과 값을 반환하기 위한 DOM 컬렉션 객체다. 둘다 유사 배열 객체이면서 이터러블이다. 중요한 특징은 노드 객체의 상태 변화를 실시간으로 반영하는 살아있는 객체다.
HTMLCollection
getElementsByTagName/ByClassName 메서드가 반환하는 HTMLCollection 객체는 노드의 상태 변화를 실시간으로 반영하는 살아있는 DOM 컬렉션 객체다. DOM 컬렉션을 사용하려면 HTMLCollection이나 NodeList 객체를 배열로 변환하여 사용하는 것을 권장한다.
Node.prototype은 parentNode, previousSibling, firstChild, childNodes 프로퍼티를 제공한다.
Element.prototype은 previousElementSibling, nextElementSibling, children 프로퍼티를 제공한다.
노드 탐색 프로퍼티는 setter 없이 getter만 존재하여 참조만 가능한 일기 전용 접근자 프로퍼티
Node.prototype.hasChildNodes
메서드 사용firstChild
프러퍼티로 접근 가능.Node.prototype.parentNode
프로퍼티 사용.Node.prototype.previousElementSibling
프로퍼티 사용Node.prototype.nodeType
, Node.prototype.nodeName
nodeValue
프로퍼티는 setter와 getter 모두 존재하는 접근자 프로퍼티textContent
요소 노드의 콘텐츠 영역 내의 텍스트를 모두 반환한다.textContent와 유사한 동작을 하는 innerText가 있는데 innerText는 css에 순종적이다. 예를 들어 innerText 프로퍼티는 css에 의해 비표시(visibility: hidden;)로 지정된 요소 노드의 텍스트를 반환하지 않는다. 즉 css를 고려해야하므로 textContent 보다 느리다
결론 textContent를 사용하자 ! ! !
DOM 조작은 새로운 노드를 생성하여 DOM에 추가학더나 기존 노드를 삭제 또는 교체하는 것을 말한다.
innerHTML
은 접근자 프로퍼티로서 요소 노드의 HTML 마크업을 취득하거나 변경한다.innerHTML
크로스 사이트 스크립팅 공격에 취야하다insertAdjacentHTML
메서드는 기존 요소를 제거하지 않으면서 위치를 지정해 새로운 요소 삽입Document.prototype.createElement(tagName)
메서드는 요소 노드를 생성하여 반환한다.Document.prototype.createTextNode(text)
메서드는 텍스트 노드를 생성하여 반환한다.Node.prototype.appendChild
메서드는 매개변수 childNode
에게 인수로 전달한 노드를 appendChild
메서드를 호출한 노드의 마지막 자식 노드로 추가한다. 언제나 마지막 자식 노드로 추가한다.Node.prototype.insertBefore(newNode, childNode)
메서드는 첫 번째 인수로 전달받은 노드를 두 번째 인수로 전달받은 노드 앞에 삽입한다.Node.prototype.cloneNode([deep: true | false])
메서드는 노드의 사본을 생성하여 반환한다. true
를 인수로 전달하면 깊은 복사하여 모든 자손노드 포함된 사본 생성, false
를 인수로 전달하거나 생략시 노드를 얕은 복사 자기 자신만의 사본을 생성한다.Node.prototype.replaceChild(newChild, oldChild)
메서드는 자신의 호출한 노드의 자식 노드를 다른 노드로 교체한다.Node.prototype.removeChild(child)
메서드는 child
매개변수에 인수로ㅓ 전달한 노드를 DOM에서 삭제한다.Element.prototype.getAttribute/setAttribute
메서드를 사용하면 attribute
프로퍼티를 통하지 않고 요소 노드에서 메서드를 통해 직접 HTML 어트리뷰트값을 취득하거나 변경할 수 있다.dataset
프로퍼티를 사용하면 HTML 요소에 정의한 사용자 정의 어트리뷰트와 자바스크립트 간에 데이터를 교환할 수 있다. data
어트리뷰트는 data-user-id
,data-role
과 같은 data-
접두사 다음에 임의의 이름을 붙여 사용한다.인라인 스타일 조작
HTMLElement.prototype.style
프로퍼티는 접근자 프로퍼티로서 요소 노드의 인라인 스타일을 취득하거나 추가 또는 변경가능하다..
으로 시작하는 클래스 선택자를 사용하여 CSS class를 미리 정의한 다음, HTML 요소의 class 어트리뷰트 값을 변경하여 HTML요소의 스타일을 변경할 수도 있다.Element.prototype.className
프로퍼티는 접근자 프로퍼티로서 HTML 요소의 class 어트리뷰트 값을 취득하거나 변경한다.Element.prototype.classList
프로퍼티는 class 어트리뷰트의 정보를 담은 DOMTokenList 객체를 반환한다. 느낀점❓
상당한 양이여서 어떻게 정리해야할지 고민하다 그래도 중요하게 생각하거나 몰랐던거를 정리하였다. 이해하는데 있어서는 어렵지 않았다. DOM이 뭐예요 라고 물어보면 단지 HTML 문서를 객체화한것이라고 말하는정도였는데 흠..이제는 브라우저 엔진이 HTML을 파싱하여 브라우저가 이해할 수 있는 자료구조로 만들어진것이 DOM이고 이 DOM은 HTML문서의 계층적 구조와 정보를 표현할 뿐만아니라 DOM를 제어 할 수 있는 DOM API(메서드, 프로퍼티) 를 제공한다. 라고 말하도록 노력하자 ... !