728x90
반응형

JavaScript [9] - DOM

DOM

  • 문서 객체 모델(Document Object Model)
  • 문서의 구조화된 표현을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공
    • 문서 구조, 스타일, 내용 등을 쉽게 변경할 수 있게 도움
    • HTML 콘첸트를 추가, 제거, 변경하고, 동적으로 페이지에 스타일을 추가하는 등
      HTML/CSS를 조작 가능
  • HTML 문서를 구조화하여 각 요소를 객체(object)로 취급
  • 단순한 속성 접근, 메서드 활용뿐만 아니라 프로그래밍 언어적 특성을 활용한 조작이 가능

DOM 구조

DOM Tree

  • DOM은 문서를 논리 트리로 표현
  • DOM에서 모든 것은 Node
  • 즉, HTML요소, 속성, 텍스트 모든 것이 노드
  • 각 노드는 부모 자식 관계를 형성하고 이에 따라 상속 개념도 동일하게 적용됨

Node

  • DOM의 구성요소 중 하나
  • HTML 문서의 모든 요소를 나타냄
    • 각각의 HTML 요소는 DOM Node로서 특정한 노드 타입을 가짐
    • Document Node => HTML 문서 전체를 나타내는 노드
    • Element Node => HTML 요소를 나타내는 노드 ex) <p>
    • Text Node => HTML 텍스트, Element Node 내의 텍스트 컨텐츠를 나타냄
    • Attribute Node => HTML요소의 속성을 나타내는 노드

DOM의 주요 객체

  •  window 
  •  document 

window object

  • DOM을 표현하는 창
  • 가장 최상위 객체(작성 시 생략 가능)
  • 탭 기능이 있는 브라우저에서는 각각의 탭을 각각의 window 객체로 나타냄

document object

  • 브라우저가 불러온 웹 페이지
  • 페이지 컨텐츠의 진입점 역할을 하며, <body> 등과 같은 수많은 다른 요소들을 포함하고 있음
  • [참고] document는 윈도우의 속성이다.

DOM 조작

  • document.querySelector(selector)
    • 제공한 선택자와 일치하는 element 한 개 선택
    • 제공한 CSS selector를 만족하는 첫 번째 element 객체를 반환(없다면 null 반환)
  • document.querySelectorAll(selector)
    • 제공한 선택자와 일치하는 여러 element를 선택
    • 매칭할 하나 이상의 셀렉터를 포함하는 유효한 CSS selector를 인자로 받음
    • 제공한 CSS selector를 만족하는 NodeList를 반환
console.log(document.querySelector('#title'))
// <h1 id="title">DOM 조작</h1>

console.log(document.querySelectorAll('.text'))
// NodeList(2) [p.text, p.text]

console.log(document.querySelector('.text'))
// <p class="text">querySelector</p>

console.log(document.querySelectorAll('body > ul > li'))
// NodeList(2) [li, li]
  • [참고] NodeList
    • DOM 메서드를 사용해 선택한 노드의 목록
    • 배열과 유사한 구조를 가짐
    • Index로만 각 항목에 접근 가능
    • 배열의 forEach 메서드 및 다양한 배열 메서드 사용 가능
    • querySelectorAll()에 의해 반환되는 NodeList는 DOM의 변경사항을 실시간으로 반영하지 않음

조작 관련 메서드 (생성)

  • document.createElement(tagName)
    • 작성한 tagName의 HTML요소를 생성하여 반환

조작 관련 메서드 (입력)

  • HTMLElement.innerText
    • Node 객체와 그 자손의 텍스트 콘텐츠(DOMString)를 표현
      (해당 요소 내부의 raw text)
    • 사람이 읽을 수 있는 요소만 남김
    • 즉, 줄 바꿈을 인식하고 숨겨진 내용을 무시하는 등 최종적으로 스타일링이 적용된 모습으로 표현됨

조작 관련 메서드 (추가)

  • Node.appendChild()
    • 한 Node를 특정 부모 Node의 자식 NodeList 중 마지막 자식으로 삽입
    • 한 번에 오직 하나의 Node만 추가할 수 있음
    • 추가된 Node 객체를 반환

조작 관련 메서드 (삭제)

  • Node.removeChild()
    • DOM에서 자식 Node를 제거
    • 제거된 Node를 반환
//h1 요소(element)를 만들고
const title = document.createElement('h1')

//텍스트를 추가하고
title.innerText = 'DOM 조작'

// 선택자로 div 태그를 가져와서
const div = document.querySelector('div')

// div 태그에 자식 요소로 추가
div.appendChild(title)

// div의 h1 요소 삭제
div.removeChild(title)

속성 조회 및 설정

  • Element.getAttribute(attributeName)
    • 해당 요소의 지정된 값을 반환
    • 인자(attributeName)는 값을 얻고자 하는 속성의 이름
  • Element.setAttribute(name, value)
    • 지정된 요소의 값을 설정
    • 속성이 이미 존재하면 값을 갱신, 존재하지 않으면 지정된 이름과 값으로 새 속성을 추가
// a tag 생성 및 컨텐츠 추가
const aTag = document.createElement('a')
aTag.innerText = '구글'

// a 태그의 href 속성 추가
aTag.setAttribute('href', 'https://www.google.com')
console.log(aTag.getAttribute('herf'))

// div 태그의 자식 태그로 a 태그 추가
const div = document.querySelector('div')
div.append(Child(aTag))

// h1 tag 선택 및 클래스 목록 조회
const h1 = document.querySelector('h1')
console.log(h1.classList)

// 클래스가 존재한다면 제거하고 false를 반환,
// 존재하지 않으면 클래스를 추가하고 true를 반환
h1.classList.toggle('blue')
console.log(h1.classList)

그 외

  • Element.setAtteibute(name, value)
    • 해당 속성이 이미 존재하는 경우 갱신 즉, 새로운 값을 추가 또는 수정이 아닌, 주어진 value로 새롭게 설정
    • 만약 기존 속성은 유지한 채로, 새로운 값을 추가하고자 한다면
  • Element.classList, Element.style 등을 통해 직접적으로 해당 요소의 각 속성들을 제어할 수 있음
728x90
반응형