본문 바로가기
  • 살짝 구운 김 유나
Web/JavaScript

JavaScript 심화 - DOM

by yunae 2022. 10. 24.

Browser APIs

: 웹 브라우저에 내장된 API로, 웹 브라우저가 현재 컴퓨터 환경에 관한 데이터를 제공 하거나, 오디오를 재생하는 등 여러가지 유용하고 복잡한 일을 수행할 수 있게 함

 

종류

  • DOM
  • Geolocation API : 지리정보
  • WebGL : 그래픽

 

 

 

DOM (Document Object Model)

: 문서 객체모델 API

문서의 구조화된 표현을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공

  • 문서 구조, 스타일, 내용 등을 쉽게 변경
  • HTML 콘텐츠를 추가, 제거, 변경하고, 동적으로 페이지에 스타일을 추가하는 등 HTML/CSS를 조작할 수 있음

- HTML 문서를 구조화 하여 각 요소를 객체 취급

- 단순한 속성 접근, 메서드 활용 뿐만 아니라 프로그래밍 언어적 특성을 활용한 조작이 가능

 

웹 페이지는 일종의 문서 (document)

- 이 문서는 웹 브라우저를 통해 그 내용이 해석되어 웹 브라우저 화면에 나타나거나 HTML 코드 자체로 나타나기도 함

- DOM은 동일한 문서를 표현, 저장, 조작하는 방법 제공

 

DOM은 웹 페이지의 객체 지향 표현이며 JavaScript와 같은 스크립트 언어를 사용하여 DOM을 수정할 수 있음

 

 

 

 

 

DOM 의 주요 객체

 

 

1) window

: DOM을 표현하는 창, 가장 최상위 객체 (작성 시 생략 가능)

- 탭 기능이 있는 브라우저에서는 각각의 탭을 각각의 window 객체로 나타냄

 

window 메서드 예시

 

 

2) document object

: 브라우저가 불러온 웹 페이지

- 페이지 컨텐츠의 진입점의 역할을 하며, <body> 등과 같은 수많은 다른 요소들을 포함하고 있음

- window의 하위 속성 (window는 기본적으로 생략하기 때문에 document)

 

 

[참고]

Parsing (파싱)

: 구문 분석, 해석

- 브라우저가 문자열을 해석하여 DOM Tree로 만드는 과정

 

 

 

 

DOM 조작

 

1) Select (선택)

 

 

document.querySelector(seletor)

: 제공한 선택자와 일치하는 element 한 개 선택

- 제공한 CSS selector를 만족하는 첫 번째 element 객체를 반환 (없다면 null)

 

 

document.querySelectorAll(seletor)

: 제공한 선택자와 일치하는 여러 element를 선택

- 매칭 할 하나 이상의 셀렉터를 포함하는 유요한 CSS selector를 인자로 받음

- 제공한 CSS selector를 만족하는 NodeList를 반환

 

사용 예시)

<body>
  <h1 id="title">DOM 조작</h1>
  <p class="text">querySelector</p>
  <p class="text">querySelectorAll</p>
  <ul>
    <li>Javascript</li>
    <li>Python</li>
  </ul>

  <script>
    console.log(document.querySelector("#title"))
    console.log(document.querySelector(".text"))
    console.log(document.querySelectorAll(".text"))
    console.log(document.querySelectorAll("ul > li"))
  </script>
</body>

-> NodeList에 querySelector를 사용하면 가장 첫번째 원소를 반환한다.

 

 

 

[참고] NodeList

- index로만 각 항목에 접근 가능

배열의 forEach 메서드 및 다양한 배열 메서드 사용 가능

querySelectorAll()에 의해 반환 되는 NodeList는 DOM의 변경사항을 실시간으로 반영하지 않음

 

ex) forEach 사용

liTags = document.querySelectorAll("ul > li")
    liTags.forEach(element => {
      console.log(element)
    });

 

 

 

2) Manipulation (조작) - 생성, 추가, 삭제 등

 

 

document.createElement(tagName)

: 작성한 tagName의 HTML 요소를 생성하여 반환

 

 

Node.innerText

: Node 객체와 그 자손의 텍스트 컨텐츠를 표현

- 사람이 읽을 수 있는 요소만 남김

- 즉, 줄 바꿈을 인식하고 숨겨진 내용을 무시하는 등 최종적으로 스타일링이 적용된 모습으로 표현

 

 

Node.appendChild()

: 한 Node를 특정 부모 Node의 자식 NodeList 중 마지막 자식으로 삽입

- 한번에 오직 하나의 Node 만 추가할 수 있음

- 추가된 Node 객체를 반환

- 만약 주어진 Node가 이미 문서에 존재하는 다른 Node를 참조한다면 현재 위치에서 새로운 위치로 이동

 

 

Node.removeChild()

: DOM에서 자식 Node를 제거

- 제거된 Node를 반환

 

메서드 사용 예시)

// 요소 만들기
const title = document.createElement('h1')

// innerText 추가하기
title.innerText = "DOM 조작하기"

// 선택자로 div 태그 가져오기
const div = document.querySelector('div')

// 자식 요소로 추가하기
div.appendChild(title)

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

 

 

 

속성 조회 및 설정

 

Element.getAttribute(attributeName)

: 해당 요소의 지정된 값을 반환

- 인자는 값을 얻고자 하는 속성의 이름

 

 

Element.setAttribute(name, value)

: 지정된 요소의 값을 설정

- 속성이 이미 존재하면 값을 갱신, 존재하지 않으면 지정된 이름과 값으로 새 속성을 추가

 

속성 설정 예시)

<head>
  ... 생략
  <style>
    .red { 
      color: red;
    }
    .blue {
      color: blue;
    }
  </style>
</head>
<body>
  <h1 class="red">안녕하세요</h1>
  <div></div>

  <script>
    const aTag = document.createElement("a")
    // 속성 값 추가
    aTag.setAttribute('href', 'https://google.com')
    // innerText 추가하기
    aTag.innerText = '구글'
    // div 태그에 삽입
    const div = document.querySelector('div')
    div.appendChild(aTag)

    const h1Tag = document.querySelector('h1')
    // 이미 속성이 존재 하므로 blue 로 덮어 쓰기
    h1Tag.setAttribute("class", "blue")
  </script>
</body>

실행결과

 

토글을 사용할 수도 있음

 

 

 

 

 

 

어제 올해 첫 붕어빵 먹었다,, 사실 방금도 먹고옴ㅜ 너무 행복하자나

 

'Web > JavaScript' 카테고리의 다른 글

JavaScript - 동기와 비동기  (0) 2022.10.26
JavaScript 심화 - Event  (0) 2022.10.24
JavaScript 기초- Object  (0) 2022.10.19
JavaScript 기초 - Array  (0) 2022.10.19
JavaScript 기초  (0) 2022.10.19

댓글