본문 바로가기
코드잇 스프린트 4기/위클리 페이퍼

[JavaScript] 이벤트 버블링, 캡처링, 위임

by devwqc 2024. 1. 27.

코드잇 스프린트 4기

5주 차 위클리 페이퍼

 

이벤트 버블링, 캡처링

자바스크립트를 이용해서 이벤트 핸들링을 다루다 보면 예상과는 다른 결과를 얻을 때가 있다.

<body>
  <div id="parent" style="width: 500px; height: 500px; background-color: #798777">
    parent
    <div id="child" style="width: 250px; height: 250px; background-color: #bdd2b6">
      child
    </div>
  </div>
  <script>
    const parent = document.querySelector('#parent');
    const child = document.querySelector('#child');
    
    const capturing = function (e) {
      console.log(`캡처링: ${e.currentTarget.id}`);
    }
    
    const bubbling = function (e) {
      console.log(`버블링: ${e.currentTarget.id}`);
    }
    
    parent.addEventListener('click', capturing, { capture: true });
    child.addEventListener('click', capturing, { capture: true });
    
    parent.addEventListener('click', bubbling);
    child.addEventListener('click', bubbling);
  </script>
</body>

 

child 구역을 눌렀을 때의 console 결과는 다음과 같다.

캡처링: parent
캡처링: child
버블링: child
버블링: parent

 

child 구역을 눌렀는데 parent가 console에 나오게 되는 이유는 이벤트 흐름에 있다.

 

이벤트에는 3가지 흐름이 있다.

· 캡처링 단계: 이벤트가 하위 요소로 전파되는 단계.

· 타깃 단계: 이벤트가 실제 타깃 요소에 전달되는 단계.

· 버블링 단계: 이벤트가 상위 요소로 전파되는 단계.

 

Window -> Document -> -> ... -> 이벤트가 발생한 곳 -> ... -> -> Document -> Window

 

child 구역을 눌렀을 때 캡처링 단계가 진행되어 Window에서 child 구역까지 이벤트가 전파되면서 parent의 capturing 이벤트 핸들러가 동작하게 된다.

child 구역을 눌렀을 때 버블링 단계가 진행되어 Window까지 이벤트가 전파되면서 parent의 bubbling 이벤트 핸들러가 동작하게 된다.

 

캡처링은 기본이 false여서 활성화하려면 addEventListener의 세 번째 인자에 true 또는 { capture: true }를 넣어주면 된다.

버블링은 기본이 true여서 비활성화 하려면 event 객체의 stopPropagation 메서드를 호출하면 된다.

 

이벤트 위임

이벤트 위임은 이벤트 버블링을 활용하는 것이다.

<body>
  <ul id="list">
    <li class="item">1</li>
    <li class="item">2</li>
    <li class="item">3</li>
    <li class="item">4</li>
    <li class="item">5</li>
  </ul>
  <script>
    const print = function (event) {
      console.log(event.target);
    }
    
    // 이벤트 위임 적용 전
    const items = document.querySelectorAll('.item');
    
    for (const item of items) {
      item.addEventListener('click', print);
    }
    
    // 이벤트 위임 적용 후
    const list = document.querySelector('#list');
    
    list.addEventListener('click', print);
  </script>
</body>

 

item을 눌렀을 때 이벤트가 동작하게 할 때 반복문을 돌면서 li 태그 하나하나에 addEventListener를 등록하는 것이 아니라 부모요소인 ul 태그 하나에 addEventListener를 등록하는 것이다.

 

감사합니다.

'코드잇 스프린트 4기 > 위클리 페이퍼' 카테고리의 다른 글

[JavaScript] 비동기 문제  (0) 2024.02.04
[HTTP] HTTP 메서드  (0) 2024.01.27
[JavaScript] var, let, const  (0) 2024.01.20
[JavaScript] 얕은 복사, 깊은 복사  (0) 2024.01.20
[Git] Git-flow  (0) 2024.01.12

댓글