JS | 이벤트 위임 원리

2023. 1. 3. 18:24·JavaScript

이벤트 위임의 원리가 되는 버블링 , 캡처링

이벤트 캡쳐링 

부모, 자식 모두 이벤트가 걸려있을 때 실행순서가 부모 -> 자식으로 실행되는 특징

addEventListener()로만 구현이 가능하다

이벤트 버블링 

부모, 자식 모두 이벤트가 걸려있을 때 실행순서가 자식 -> 부모로 실행되는 특징

버블링페이지에서만 이벤트를 실행

 

캡쳐링은 이벤트를 실행시키지 않음

 

 

 

 

 

예제 1 )

 

style ↓↓↓

더보기
<style>
        .func1 {width:300px;height:300px;background-color: red;}
        .func2 {width:200px;height:200px;background-color: blue;}
        .func3 {width:100px;height:100px;background-color: yellow;}

    </style>

html

↓↓↓

더보기
 <div class="func1">
        <div class="func2">
            <div class="func3">func3자식</div>
        </div>
    </div>

script ↓↓↓

 /*
        DOM에서 이벤트 동작방식은 기본으로 버블링입니다.
        버블링 - 부모, 자식 모두에 이벤트가 있을 때 이벤트가 자식 -> 부모 방향으로 전파되는 특징

        3번 클릭 3 -> 2 -> 1 순으로 실행됩니다.
        */
        // var func1 = document.querySelector(".func1");
        // func1.onclick = function(){
        //     alert("func1");
        // }

        // var func2 = document.querySelector(".func2");
        // func2.onclick = function(){
        //     event.stopPropagation(); //이벤트 버블링 중단
        //     alert("func2");
        // }

        // var func3 = document.querySelector(".func3");
        // func3.onclick = function(){
        //     alert("func3");
        // }

        /*
        이벤트 캡쳐링 -> 부모, 자식에 이벤트가 있을 때, 부모 -> 자식으로 전파되는 특징
        addEventListener() 방식으로만 구현해 줄 수 있습니다.
        */
        var func1 = document.querySelector(".func1");
        var func2 = document.querySelector(".func2");
        var func3 = document.querySelector(".func3");

        func1.addEventListener("click", function() {
            alert("func1");
        }, true);

        func2.addEventListener("click", function() {
            event.stopPropagation();//이벤트 캡쳐링 중단
            alert("func2");
        }, true);

        func3.addEventListener("click", function() {
            alert("func3");
        }, true);

예제 2 ) 이벤트 전파와 여러 클래스

html ↓↓↓

더보기
 <section id="section">
        <div class="list">
            <div>
                <span>홍길동</span>
                <button type="button" class="btn sel">선택</button>
                <button type="button" class="btn del">삭제</button>
            </div>
            <div>
                <span>김길동</span>
                <button type="button" class="btn sel">선택</button>
                <button type="button" class="btn del">삭제</button>
            </div>
            <div>
                <span>홍길자</span>
                <button type="button" class="btn sel">선택</button>
                <button type="button" class="btn del">삭제</button>
            </div>
        </div>
    </section>

script ↓↓↓

  var list = document.querySelector(".list");

        //위임을 내려받아 버튼별로 다르게 동작시킴
        list.onclick = function(){

            if(event.target.tagName != "BUTTON")return; //버튼이 아니라면 종료
            
            console.log(event.target.className);
            console.log(event.target.classList);

            var arr = event.target.classList;

            if(arr.contains("sel")){ //선택 버튼
                event.target.previousElementSibling.style.color = "red";
            }else if(arr.contains("del")){ //삭제 버튼
                event.target.parentElement.remove();
            }else if(arr.contains("aaa")){ //aaa 버튼

            }

        }

 

'JavaScript' 카테고리의 다른 글

JS | 이벤트 객체와 dataset  (0) 2023.01.03
JS | 토글탭 실습  (1) 2023.01.03
JS | 이벤트 중단  (0) 2023.01.03
JS | 이벤트 객체  (0) 2023.01.03
JS | 실습 2 (toggle)  (0) 2023.01.03
'JavaScript' 카테고리의 다른 글
  • JS | 이벤트 객체와 dataset
  • JS | 토글탭 실습
  • JS | 이벤트 중단
  • JS | 이벤트 객체
개발 공부
개발 공부
  • 개발 공부
    개발 공부
    개발 공부
  • 전체
    오늘
    어제
    • 전체보기 (164)
      • 프로젝트 (1)
      • TypeScript (1)
      • JavaScript (46)
      • Node.js (3)
      • Next.js (5)
      • React (17)
      • NoSQL (0)
      • HTML,CSS (3)
      • CS (6)
      • Java (35)
      • Spring (6)
        • Spring의 정석 (1)
      • Spring boot (1)
      • MySQL (1)
      • 리눅스 (16)
      • JSP (9)
      • AWS (0)
      • git (2)
      • 알고리즘 (1)
      • ect (7)
      • Project (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    Java의 정석
    자바의 정석
    오블완
    Java
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발 공부
JS | 이벤트 위임 원리
상단으로

티스토리툴바