프론트엔드/JavaScript

자바스크립트 - 버블링, 캡쳐링의 활용과 이벤트 위임

ksge7 2020. 10. 20. 12:05

버블링과 캡쳐링에 대해서 이미 정리한 내용이 있다.

 

그런데 어째서 이 버블링과 캡쳐링을 써야 하는지 의문이 들때가 있다.

 

실제 예시가 없으면 왜 필요한지 알 수 없기 때문이다.

 

우선 가장 간단하게 알 수 있는 이벤트 위임(event delegation)을 통해 알아보자.

 

<body>

    <div id="div">
        <button id = "1번"> 1번 버튼 </button><br><br>
        <button id = "2번"> 2번 버튼 </button><br><br>
        <button id = "3번"> 3번 버튼 </button><br><br>
        <button id = "4번"> 4번 버튼 </button><br><br>
        <button id = "5번"> 5번 버튼 </button><br><br>
    </div>
    
    <button> div 밖의 버튼 </button>
    
</body>
</html>

 

위와 같은 코드가 있다고 생각해보자.

 

만약 5개의 버튼에 기능을 준다고 생각해보자. 기존 방법을 쓰면 다음과 같이 해야한다.

 

<body>

    <div id="div">
    
        <button id = "1번"> 1번 버튼 </button><br><br>
        <button id = "2번"> 2번 버튼 </button><br><br>
        <button id = "3번"> 3번 버튼 </button><br><br>
        <button id = "4번"> 4번 버튼 </button><br><br>
        <button id = "5번"> 5번 버튼 </button><br><br>
        
    </div>
    
    <button> div 밖의 버튼 </button>
    
</body>

<script>

    let no1 = document.getElementById('1번').addEventListener('click', function(e){ console.log(e.target) });
    let no2 = document.getElementById('2번').addEventListener('click', function(e){ console.log(e.target) });
    let no3 = document.getElementById('3번').addEventListener('click', function(e){ console.log(e.target) });
    let no4 = document.getElementById('4번').addEventListener('click', function(e){ console.log(e.target) });
    let no5 = document.getElementById('5번').addEventListener('click', function(e){ console.log(e.target) });
    
</script>

 

5개의 버튼을 이용하려면 5개의 객체를 만들고 일일이 이벤트 리스너 메서드를 지정해줘야 했다.

 

하지만 이벤트 캡쳐링을 이용하면 이를 쉽게 극복할 수 있다.

 

<body>

    <div id="div">
    
        <button id = "1번"> 1번 버튼 </button><br><br>
        <button id = "2번"> 2번 버튼 </button><br><br>
        <button id = "3번"> 3번 버튼 </button><br><br>
        <button id = "4번"> 4번 버튼 </button><br><br>
        <button id = "5번"> 5번 버튼 </button><br><br>
        
    </div>
    
    <button> div 밖의 버튼 </button>
    
</body>

<script>

    let div = document.getElementById('div').addEventListener('click', function(e){ console.log(e.target) });
    
</script>

 

버튼의 상위 노드인 <div>에 이벤트 핸들러 메서드를 부여하면 캡쳐링에 따라 그 아래도 영향을 받는다.

 

이렇게하면 위와 똑같이 기능을 하면서도 코드를 획기적으로 줄일 수 있다.

 

이는 캡쳐링에 따라 상위에서 하위 노드로 이벤트가 전파 된 것으로 볼 수 있다.

 

그리고 이러한 방식의 이벤트 실행을 이벤트 위임(evnet delegation)이라 한다.