자바스크립트

이벤트 버블링, 캡쳐링

2025. 6. 5. 13:51

이벤트 버블링

이벤트가 발생했을 때 가장 안쪽 타겟요소에서부터 시작해서 부모요소로 거슬러올라가며 전파되는 단계.
브라우저의 기본 이벤트 전파 방식.

타깃리스너 실행 이후 전파된다.


버튼 ✅"click" 이후,

<window>

    ↑

<document>

    ↑

<body> *addEventListener("click", ~) 가 부착되어있다면, (event.currentTarget)

    ↑

<div>

    ↑

<button> (event.target)


활용

- 이벤트 위임

부모 요소에 리스너를 한번만 등록해두면 자식요소의 이벤트 클릭을 감지할 수 있다.

-> 부모 요소 안에 이벤트를 감지해야하는 자식요소가 동적으로 여러개 생기는 경우 효과적 (ex. <ul>태그 안의 <li>들)

function attachTodoListEvents() {
  const todoList = document.querySelector('#todoList'); // <ul>
  if (!todoList) return;

  // ul요소에 클릭이벤트 위임
  todoList.addEventListener('click', function (e) {

    // 클릭이벤트가 최초로 시작된 자식요소 찾고 '.todo-checkbox'에 일치하는 가까운 상위요소 추적
    const clickedCheckbox = e.target.closest('.todo-checkbox');
    // 일치하는 요소(체크박스)가 있으면 체크박스를 누른것으로 감지
    if (clickedCheckbox) {
      // -- 각 li의 체크박스에 추가하려던 이벤트 설정 --
      // 누른 체스박스와 가까운 상위요소를 찾아 li(타겟 리스트) 추적
      const clickedLi = clickedCheckbox.closest('.todo-item'); // <li>
      if (!clickedLi) return;

      const clickedTodoId = clickedLi.dataset.id;
      toggleTodoComplete(clickedTodoId);
    }
  });
}

 

이벤트 캡쳐링

이벤트가 최상위 부모요소에서부터 시작해 타겟 요소까지 내려오며 전파되는 단계.

기본적으로 비활성화 되어있음. addEventListener 함수 세번째 옵션으로 활성화.

타깃리스너 실행 전에 캡쳐링이 시작된다. (타겟요소까지 이벤트가 전파 된 후에 타깃리스너 실행)


버튼 ✅"click" 이후,

<window>

    ↓

<document>

    ↓

<body> *addEventListener("click", ~) 가 부착되어있다면, (event.currentTarget)

    ↓

<div>

    ↓

<button> (event.target)


활용

- 부모요소에서 자식요소보다 먼저 이벤트를 처리해야할 때 사용 (ex. 모달창 바깥 영역 클릭 감지)

const modalBackdrop = document.getElementById("modal-backdrop");
const modal = document.getElementById("modal");

// 바깥 클릭 감지 - 캡처링 단계에서 감지 (true)
document.addEventListener(
  "click",
  (event) => {
    if (!modal.contains(event.target)) {
      console.log("모달 바깥 클릭됨 → 모달 닫기");
      // -- 모달 닫는 동작 --
      modalBackdrop.style.display = "none";
    }
  },
  true
);

// 모달 내부 클릭은 stopPropagation 처리
modal.addEventListener("click", (event) => {
  event.stopPropagation(); // 모달안에서의 클릭이 상위요소로 전파되지 않게 차단
  console.log("모달 내부 클릭");
});

하지만 이벤트 캡쳐링은 대부분 사용되지 않는다.

1. 브라우저의 기본 동작으로 이벤트버블링만 활성화 되어있음

2. 이벤트의 전파를 막고 싶을때 자식요소에서 stopPropagation()을 호출해도 캡쳐링 단계에서는 이미 부모리스너가 실행된 상태임 (제어 어려움)
* stopPropagation()은 상위요소로의 이벤트 전파를 막는다.

이러한 이유로 특수한 패턴이 아니라면 거의 사용되지 않는다.

 

 

'자바스크립트' 카테고리의 다른 글

소수점 숫자 연산시 주의사항  (0) 2022.10.19
애니매이션 만드는 법  (0) 2022.10.08
외부문서를 연결해주는 <link>  (0) 2022.10.07
소수 문제  (0) 2022.09.23
Math.random 랜덤숫자 활용하기  (0) 2022.09.09