DOM(Document Object Model)이란??
=> ★ JS를 통해 쿼리하거나 조작하기 위해 파싱된 HTML 및 CSS 콘텐츠의 표현
브라우저는 웹사이트를 불러오면 HTML 코드를 분석한다. (파싱)
모든 HTML element를, 자바스크립트 객체 묶음으로 해석해준다.
⇒ DOM을 통해 js코드는 화면에 표시되는 내용을 쿼리 및 조작하여 ★대화형 웹사이트를 구축할 수 있다.
DOM을 업데이트하지만 HTML 소스코드 문서의 내용을 변경하진 않는다.
⇒ DOM에 접근하여 HTML element 의 속성을 변경하거나 기타 기능을 구현할 수 있음. (document 속성을 사용해서 DOM에 접근할 수 있다.)
cf. defer 속성
전체문서가 분석되기까지 스크립트 실행이 지연되어야 한다고 브라우저에게 알리는 역할이다.
<script src="demo.js" defer></script>
브라우저가 HTML 문서를 로드한 후 파싱하여 생성하는 모델을 의미한다.
=> 각 객체(요소, 어트리뷰트, 텍스트)들이 Tree형태로 구조화 되어있어 DOM Tree라 칭한다.
4종류의 노드로 구성된다.
1. 문서 노드 (엔트리 포인트)
2. 요소 노드
3. 어트리뷰트 노드
4. 텍스트 노드 (최종점)
요소를 파헤치는 방법 (drill)
e.g. document.body.children[0].firstChild ⇒ 대신 정확한 구조를 파악해야함.
유틸리티 함수로 특정요소를 쿼리
(1) document.getElementById()
id에 일치하는 요소노드 중 첫번째 요소를 반환.
(2) document.querySelector();
=> CSS selector 사용하여 해당 엘리먼트 노드 중 첫번째 요소를 반환
(3) document.querySelecorAll()
=> 마찬가지로 셀렉터 사용하여 해당 요소 노드를 '모두' 선택한다.
const ul = document.querySelector('ul');
console.log(ul.textContent);
innerText
=> 비표준이고, CSS에 순종적이라한다.(visibility: hidden; 지정되어있으면 텍스트가 반환X), 그리고 CSS 고려해야해서 textContent보다 느리다.
innerHTML
=> 모든 콘텐츠를 하나의 문자열(마크업 포함)로 취득할 수 있고, 새로운 요소를 DOM에 삽입할 수도 있다.
const myLi = document.createElement(li);
const newText = document.createTextNode('bae');
myLi.appendChild(newText);
cf. insertAdjacentHTML()
인자로 전달한 텍스트를 HTML로 파싱하고 생성된 노드를 DOM 트리의 지정된 위치에 삽입
insertAdjacentHTML이나 innerHTML은 크로스 스크립팅 공격에 취약하다고 한다.
=> 따라서 텍스트를 추가하거나 변경할때는 textContent()를 사용하고,
새로운 element를 추가하거나 삭제할때는 DOM 조작 방식을 사용하도록 하자.