브라우저의 핵심 기능은
사용자가 참조하고자 하는 웹페이지를 서버에 요청하고 서버의 응답을 받아 브라우저에 표시하는 것
· Client Side = 웹 브라우저
· Server Side = node.js, NGiNX 등의 웹서버
객체 지향 모델로서 구조화된 문서를 표현하는 양식 ( XML, HTML 문서의 프로그래밍 인터페이스 )
모든 요소와 요소의 Attribute, Text 를 각각의 "Object"로 만들고 이들 객체를 부자 관계를 표현할 수 있는 "Tree Structure"로 구성한 "Document Based Model"
DOM은 JavaScript 를 통해 동적으로 변경할 수 있으며 변경된 DOM은 랜더링에 반영 ( HTML 문서를 읽고 마음대로 조작할 수 있음 )
· DOM은 메모리상에 존재
· 정적인 웹페이지에 접근하여 동적으로 웹페이지를 변경하기 위한 방법은 DOM을 변경하는 것
· DOM에 접근하고 변경하는 property와 method의 집합은 DOM API임
· DOM은 구조화된 표현(Structured representation)을 제공하여 프로그래밍 언어가 문서 구조, 스타일, 내용 등을 변경할 수 있도록 함
DOM 에서 모든 Element, Attribute, Text 는 하나의 Object 이며 Document 객체의 자식
<!DOCTYPE html>
<html>
<head>
<style>
.red { color: #ff0000; }
.blue { color: #0000ff; }
</head>
<body>
<div>
<h1> Cities </h1>
<ul>
<li id="one" class="red> Seoul </li>
<li id="two" class="blue> London </li>
<ul>
</div>
</body>
</html>
⚪ 문서 노드 (Document Node)
<!DOCTYPE html>
Tree 의 최상단
DOM Tree 에 접근하기 위한 시작점
Element, Attribute, Text Node 등에 접근하려면 Document Node 를 통해야함
⚪ 요소 노드 (Element Node)
<head></head>, <div></div>, <li>
HTML.Element 객체를 상속 후 요소별 특성을 표현한 객체 모델
문서의 구조를 서술
Attribute, Text Node 등에 접근하기 위해 Attribute Node를 찾아서 접근
⚪ 어트리뷰트 노드 (Attribute Node)
id="one", class="red"
HTML Element 의 Attribute(속성)을 표현한 Node
Attribute Node 는 해당 Attribute 가 지정된 요소의 자식이 아니라 해당 요소의 "일부"로 표현
⚪ 텍스트 노드 (Text Node)
Cities, Seoul, London
DOM Tree의 최종단
HTML Element 의 Text 를 표현한 Node
Text Node 는 Element Node 의 자식,
Query : 질문, 문의하다
👉 DataBase 에 특정한 데이터를 보여달라는 클라이언트(사용자)의 요청
< 쿼리문을 작성한다 = DataBase에서 원하는 정보를 가져오는 코드를 작성한다 >
출력에서 Elements Collection(요소들의 모음)인 경우, 배열처럼 인덱싱이 되는 기능을 가짐
Elements Collection은 Object - collection 으로 나타나며,
Element 경우 Object - Element 로 나타남
document.getElementById("id");
document.querySelector('.category.Margin .ribbon')
⚪ document.getElementById('id')
Id Attribute 값으로 Element Node 1개 선택
복수로 선택된 경우, 첫번째 Element만 반환
Return 👉 HTMLElement를 상속받은 Object
⚪ document.querySelector('cssSelector')
CSS Selector 로 element Node 중 1개 선택
첫번째 Element 만 반환
Return 👉 HTMLElement를 상속받은 Object
document.getElementsByTagName("li");
document.getElementByClassName("odd");
document.getElementsByName("first");
document.querySelectorAll('#id, .class');
⚪ document.getElementsByClassName()
Class Attribute 값으로 Element Nodes 모두 선택
공백으로 구분하여 여러 개의 class 지정 가능
Return 👉 HTMLCollection (live)
⚪ document.getElementsByTagName()
Tag Name 통해 Element Nodes 모두 선택
Return 👉 HTMLCollection (live)
⚪ document.querySelectorAll()
CSS Selector 로 Element Node 모두 선택
"," 를 통해 Elements 동시에 선택 가능
반환 Object가 NodeList 이므로, for문 또는 forEach문을 사용
Return 👉 NodeList (non-live)
live와 non-live 의 차이
객체의 속성값 변경이 동적으로 반영
반복문의 조건 등에 직접적으로 영향을 줌
실시간 = Live
// Text Node 의 부모 요소 Node 를 선택
const one = document.getElementById('one')
> console.dir(one) // HTMLLIElement: li#one.red
> console.log(one.nodeName) // LI
> console.log(one.nodeType) // 1: Element node
// firstChild property 로 Text Node 탐색
const textNode = one.firstChild;
> console.log(textNode.nodeName) // #text
> console.log(textNode.nodeType) // 3: Text node
> console.log(textNode.nodeValue) // Seoul
// nodeValue property 로 Text 수정
textNode.nodeValue = 'Busan';
⚪ Text에 접근하는 순서
1. 해당 Text Node의 부모 요소 노드를 선택
2. node.firstChild
property 를 사용하여 Text Node 탐색
3. 텍스트 노드의 유일한 property nodeValue
이용 텍스트 취득 / 수정
nodeValue
노드의 값 반환
return 👉 Text Node > 문자열 // Element Node > null
const input = document.querySelector('input[type=text]')
// input에 'say' Attribute 가 존재하는지 확인,
// 없으면 'say' 를 Attribute 로 추가하고 값으로 'hello!' 설정
if (!input.hasAttribute('say')) {
input.setAttribute('say', 'hello!');
}
// input 의 'say' Attribute 의 value 를 취득
console.log(input.getAttribute('say') // hello!
// input 의 'say' Attribute 를 제거,
// 그 후 input 에 'say' Attribute 가 존재하는지 확인
input.removeAttribute('say')
console.log(input.hasAttribute('say')) // false
⚪ node.hasAttribute(attribute)
지정한 Attribute 를 갖고있는지 검사함
return 👉 Boolean
⚪ node.getAttribute(attribute)
Attribute Value 취득
return 👉 string(문자열)
⚪ node.setAttribute(attribute)
Attribute 와 Attribute Value 를 설정
return 👉 undefined
⚪ node.removeAttribute(attribute)
Attribute 삭제
return 👉 undefined
const newElement = document.createElement('li') // Element 생성
const newText = document.createTextNode('Beijing') // Text Node 생성
newElement.appedchild(newText) // newText(TextNode) 를 NewElement 자식으로 DOM Tree 추가
const container = document.querySelector('ul')
container.appendChild(newElement) // NewElement 를 container 자식으로 DOM Tree 추가
⚪ createElement(tagName)
tagName 을 Argument(인자) 로 전달하여 Element 생성
return 👉 HTMLElement 를 상속받은 Object
⚪ createTextNode(text)
text 를 Argument 로 전달하여 Text Node 생성
return 👉 Text Object
⚪ appendChild(Node)
Argument 로 전달한 Node 를 마지막 자식 Element 로 Dom Tree 추가
return 👉 undefined
⚪ removeChild(attribute)
Argument 로 전달한 Node 를 DOM Tree 에서 제거
return 👉 undefined