본문 바로가기
TIL

2024.02.29 8일차 DOM

by Song.dev 2024. 2. 29.

DOM

DOM은 Document Object Model의 약자로,

HTML 요소를 Object(JavaScript Object)처럼 조작(Manipulation)할 수 있는 Model

즉, JavaScript를 사용해 DOM으로 HTML을 조작할 수 있음

 

DOM은 트리 구조로 이루어져 있음

 

<script> 태그의 위치

웹 브라우저가 작성된 코드를 해석하는 과정에서 <script> 요소를 만나면,

웹 브라우저는 HTML 해석을 잠시 멈추고  <script> 요소를 먼저 실행

즉 태그로 연결한 스크립트 파일을 다 실행할 때까지 html 멈춘다는 점을 주의해야 함

 

1. <head> 안쪽에 <script> 태그 삽입

2. <body> 안쪽에 <script> 태그 삽입  (권장)

 

jQuery 추가하기

jQuery 라이브러리를 사용하기 위해 HTML 문서에 jQuery를 추가하기 위해서는 <script> 태그를 사용함

일반적으로는 Google CDN에서 제공하는 jQuery 링크를 사용

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>

 

jQuery 사용 예제

$(document).ready(function(){
    console.log('welcome jQuery');

    let msgElement = $('#msg');
    console.log(msgElement);
});

 

JavaScript를 활용해 DOM 조작 간단한 실습

CRUD

// 태그를 생성
const test = document.createElement('div');

// 태그를 삽입할 위치를 조회
const containerDiv = document.querySelector('#container');

// 쿼리셀렉터로 가져온 위치 아래에 자손으로 추가
// 다른 자손들이 있다면 가장 아래에 추가
containerDiv.append(test); 

// 태그 안에 content(웹페이지에 표시될 내용)
test.textContent = "spring"; 

// 해당 태그에 클래스 추가
test.classList.add('tweet');

// html 내에서 해당 태그 삭제
test.remove();

 

** querySelectorAll 반환 결과는 어떤 타입일까

 

NodeList(4) [div.tweet, div.tweet, div.tweet, div.tweet]

  1. 0: div.tweet
  2. 1: div.tweet
  3. 2: div.tweet
  4. 3: div.tweet
  5. length: 4
  6. [[Prototype]]: NodeList

      * 유사배열 : 배열과 유사하게 관리할 수 있음 length, 인덱스로 접근해서 수정 가능

      * 만약 일치하는 항목이 없다면 빈 배열을 반환

// document 내의 클래스가 note, alert인 모든 div element 목록을 반환
const matches = document.querySelectorAll("div.note, div.alert");

// id가 test인 컨테이너 안에 위치하고
// 부모 엘리먼트가 div.highlighted인 <p> 엘리먼트의 목록을 반환
const container = document.querySelector("#test");
const matches = container.querySelectorAll("div.highlighted > p");

  * 중첩 시 주의사항 다시 읽고 정리할 것!

 

onclick 방식

이벤트 핸들러 함수

 

 

키 업 트리거   

  * 키 업(키보드의 키를 눌렀다 뗄 때)

  * 이벤트 발생 시 함수 자체를 저장한 변수를 활용
  * e.target.value 는 이벤트 객체로 들어온 값

  * classList를 활용해 클래스 속성을 더하거나 없애며 CSS (display: none)를 사용해 

    화면에서 특정 요소를 보이지 않게 할 수 있음 

elUserName.onkeyup = eventKeyUp;

function eventKeyUp(e) {
    let currentValue = e.target.value;
    
    // 4글자 이상 이하 분기 필요
    if(checkStringLength(currentValue)) {
        // 4개 이상일 때 
        elFailureMessage.classList.add('hide');
        elSuccessMessage.classList.remove('hide');
    } else {
        // 4개 이하일 때
        elFailureMessage.classList.remove('hide');
        elSuccessMessage.classList.add('hide');
    }
}

 

  * 특수문자 포함 여부는 반복문을 사용하거나 정규표현식을 활용할 수 있음

 

 

  *** 조건이 복잡한 경우 주석으로 분기점을 정리해보면서 놓치는 케이스가 없도록 한다