실습용 CodePen


<aside> 💡 이벤트 버블링/캡처링, stopPropagation(), preventDefault()까지 모두 실습할 수 있도록 작성함

</aside>

https://codepen.io/colorfilter/pen/rNmXxEe

이벤트 전파 | Event Propagation


버블링 Bubbling / 캡처링 Capturing

위 코드펜 예제에서 하단에 있는 span 태그를 클릭하면 ➊ "span 영역" → ➋ "p 영역" → ➌ "div" 영역 순으로 콘솔이 찍힌다. span 영역을 클릭한 순간 브라우저가 이벤트를 감지해서 최상위에 있는 요소까지 이벤트가 전달되는 것. 이것을 이벤트 버블링이라고 부른다.

이벤트 캡처링은 버블링 반대방향으로 진행된다. addEventListener() 3번째 인자에 true를 명시하면 된다. 이는 { capture: true }를 명시한 것과 같다. 기본 값은 { capture: false }다.

하단의 span 태그를 클릭하면 콘솔에 ➊ "div 영역" → ➋ "p 영역" → ➌ "span" 영역 순으로 콘솔이 찍힌다. <span> 태그를 클릭한 순간 최상위 요소 <html> 태그부터 이벤트가 발생한 <span> 태그까지 내려가며 탐색하기 시작한다. 탐색하는 과정에서 중간을 거치는 요소에 할당된 핸들러가 실행돼서 콘솔이 찍히는 것.

리스너 옵션

addEventListener의 3번째 인자엔 capture외에 2가지 옵션이 더 있다.

리스너 제거 removeEventListener

이벤트 리스너를 제거할 때 removeEventListener 메서드를 사용한다. 주의할 점은 이벤트를 등록했을 때의 핸들러(콜백)와, capture 리스너 옵션(리스너 3번째 매개변수) 값이 일치해야만 제거된다. 따라서 이벤트 리스너를 제거할 땐 이벤트를 등록했을 때와 동일한 핸들러와 capture 옵션을 명시해야 한다.