JavaScript

JS | 이벤트 위임 원리

개발 공부 2023. 1. 3. 18:24

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

이벤트 캡쳐링 

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

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 버튼

            }

        }