DOM/디바운스,스로틀

2022. 7. 7. 20:24·JavaScript
728x90
반응형

DOM(Document Object Model)

HTML 문서의 계층적 구조와 정보를 표현하며 이를 제어할 수 있는 API, 즉 프로퍼티와 메서드를 제공하는 트리 자료구조

 

노드

<div class = "greeting">Hello</div>

   div       /         class        /    greeting        / Hello      / div

start tag / attribute name / attribute value / contents / end tag

 

요소 노드 : div / 어트리뷰트 노드 : class:"greeting" / 텍스트 노드 : "Hello"

 

노드 객체들로 구성된 트리 자료구조를 DOM / DOM트리라고 한다

 

 

출처 : https://poiemaweb.com/js-dom 

 

  • 문서 노드(Document Node)
    트리 최상위의 루트노드, HTML 문서당 document는 유일함, 하위 노드에 접근하려면 문서 노드를 통해야 함
  • 요소노드
    HTML 요소를 가리키는 객체, HTML 요소는 중첩에 의해 부자 관계를 가지며 이 부자 관계를 통해 정보를 구조화 한다
    요소 노드는 문서의 구조를 표현함
  • 어트리뷰트 노드
    HTML 요소의 어트리뷰트를 가리키는 객체, 어트리뷰트 노드는 그림과 같이 요소노드를 통해 접근이 가능함
  • 텍스트 노드
    텍스트 노드는 HTML 요소의 텍스트를 표현, 최종단에 위치한 노드(자식 노드를 가질 수 없다)

노드 객체의 상속 구조

출처 : https://velog.io/@hangem422/js-web-node

 

노드 객체에는 모든 노드 객체가 공통으로 갖는 기능도 있고, 노드 타입에 따라 고유한 기능도 있다

노드 객체의 공통된 기능일수록 프로토타입 체인 상위 , 개별 기능은 체인 하위에 구축하여 상속 구조를 갖는다

 

▶DOM은 HTML 문서의 계층적 구조와 정보를 표현하는 것은 물론 노드 객체의 종류, 즉 노드 타입에 따라 필요한 기능을 프로퍼티와 메서드의 집합인 DOM API로 제공한다. 이것을 통해 HTML의 구조나 내용 또는 스타일 등을 동적으로 조작할 수 있다 

 

DOM

CSS 선택

input 요소중 type 어트리뷰트 값이 'text'인 요소를 모두 선택
input[type=text] {} 

자식 선택자 : div요소의 자식 요소 중 p를 모두 선택
div > p {}

인접 형제 선택자 : p 요소의 형제 요소 중에 p 요소 바로 뒤에 위치하는 ul 요소를 선택
p + ul {}

일반 형제 선택자 : p 요소의 형제 요소 중에 p 요소 뒤에 위치하는 ul 요소를 모두 선택
p ~ ul {}

 

NodeList 객체는 실시간 노드 객체 상태 변경 반영하는 live 객체로 동작

 

안전한 DOM 컬렉션 -> HTMLCollection , NodeList 객체를 배열로 변환하여 사용해라

 

사용자로 부터 입력ㅂ다은 데이터를 그대로 innerHTML 프로퍼티에 할당하는 것은 XSS에 취약함

HTML 마크업 내에 자바스크립트 악성 코드가 포함되어 있다면 파싱 과정에서 그대로 실행될 가능성

 

나머지 내용은 쭉 읽어봤다

이벤트와 타이머는 부분부분 정리할 예정이다

 

타이머: 디바운스와 스로틀

짧은 시간 간격으로 연속하여 발생하는 이벤트를 그룹화해서 과도한 이벤트 핸들러의 호출을 방지하는 프로그래밍 기법

이벤트 예시 : scroll,resize,input,mousemove

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <button>click me</button>
  <pre>일반 클릭 이벤트 카운터 <span class="normal-msg">0</span></pre>
  <pre>디바운스 클릭 이벤트 카운터 <span class="debounce-msg">0</span></pre>
  <pre>일반 클릭 이벤트 카운터 <span class="thottle-msg">0</span></pre>
  <script>
    const $button=document.querySelector('button')
    const $normalMsg=document.querySelector('.normal-msg')
    const $debounceMsg=document.querySelector('.debounce-msg')
    const $throttleMsg=document.querySelector('.thottle-msg')

    const debounce=(callback,delay)=>{
      let timerId;
      return event=>{
        if(timerId) clearTimeout(timerId)
        timerId=setTimeout(callback,delay,event)
      }
    }

    const throttle=(callback,delay)=>{
      let timerId
      return event=>{
        if(timerId) return
        timerId=setTimeout(()=>{
          callback(event)
          timerId=null
        },delay,event)
      }
    }

    $button.addEventListener('click',()=>{
      $normalMsg.textContent= + $normalMsg.textContent+1
    })
    $button.addEventListener('click',debounce(()=>{
      $debounceMsg.textContent= + $debounceMsg.textContent+1
    },500))
    $button.addEventListener('click',throttle(()=>{
      $throttleMsg.textContent= + $throttleMsg.textContent+1
    },500))
  </script>
</body>
</html>

 

버튼을 빠르게 누르게 되면 일반 클릭 이벤트 카운터만 클릭 횟수에 맞춰서 올라간다

 

디바운스

input 이벤트는 사용자가 텍스트 입력 필드에 값을 입력할 때마다 연속해서 발생한다.

debounce 함수가 반환한 함수는 debounce 함수에 두번째 인수로 전달한 시간(delay)보다 짧은 간격으로 이벤트가 발생하면 이전 타이머를 취소하고 새로운 타이머를 재설정한다.

짧은 시간 간격으로 이벤트가 연속해서 발생하면 이벤트 핸들러를 호출하지 않다가 일정 시간 동안 이벤트가 더 이상 발생하지 않으면 이벤트 핸들러가 한 번만 호출되도록 하는 것이 디바운스

-> resize,input 요소에 입력되 값으로 ajax 요청하는 입력 필드 자동완성 UI구현, 버튼 중복 클릭 방지등 유용하게 사용

 

스로틀

짧은 시간 간격으로 이벤트가 연속해서 발생하더라도 일정 시간 간격으로 이벤트 핸들러가 최대 한번만 호출되도록 함

이벤트를 그룹화해서 일정 시간 단위로 이벤트 핸들러가 호출되도록 호출 주기를 만든다

-> scroll 이벤트처리, 무한 스크롤 UI구현 등에 사용

출처

https://velog.io/@soulee__/Javascript-%EC%93%B0%EB%A1%9C%ED%8B%80%EB%A7%81-%EB%94%94%EB%B0%94%EC%9A%B4%EC%8B%B1-throttle-debounce

 

 

 

728x90
반응형
저작자표시 (새창열림)

'JavaScript' 카테고리의 다른 글

Ajax  (0) 2022.07.11
비동기 프로그래밍  (1) 2022.07.10
브라우저의 렌더링 과정  (0) 2022.07.07
Set과 Map  (0) 2022.06.30
스프레드 문법/디스트럭처링 할당  (1) 2022.06.30
'JavaScript' 카테고리의 다른 글
  • Ajax
  • 비동기 프로그래밍
  • 브라우저의 렌더링 과정
  • Set과 Map
Hun-bot
Hun-bot
IT를 중심으로 다양한 것
  • Hun-bot
    로봇이 만드는 눈사람
    Hun-bot
  • 전체
    오늘
    어제
    • All Article (128)
      • Programmers (6)
        • TIP (1)
        • SQL (2)
        • LV1 (1)
        • LV2 (2)
        • LV3 (0)
      • Baekjoon (31)
        • Bronze (10)
        • Silver (19)
        • Gold (2)
        • Platinum (0)
        • Diamond (0)
      • Leetcode (0)
        • Easy (0)
        • Medium (0)
        • Hard (0)
        • SQL (0)
      • 알고리즘(Algorithm) (42)
      • JavaScript (40)
      • Linux (7)
      • JSP (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Javascript
      Programmers
      JS #JavaScript #프로그래머스 #카카오
      리눅스
      JSP #Vscode #톰켓 #Tomcat #Java #Web #jdk
      SQL
      리눅스 #입문
      프로그래머스
      자바스크립트 #연습문제
      BaekJoon
      Vue #Vue.js #정리
      고득점 Kit
      Algorithm
      자바스크립트
      백준
      JS #JavaScript #프로그래머스 #알고리즘
      JS #프로그래머스 #숫자의표현 #알고리즘
      알고리즘
      c++
      LeetCode #JS #Javascript #Algorithm
      JS #클래스
      프로그래머스 #자바스크립트 #JS
      async await #js #문법 #자바스크립트 #비동기
      티스토리챌린지
      알고리즘 #Algorithm
      오블완
      Python #알고리즘
      JavaScript #Set #Collection
      JS #javascript #객체 #Object
      JS #정규표현식
    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    Hun-bot
    DOM/디바운스,스로틀
    상단으로

    티스토리툴바

    티스토리툴바