각 요소마다 이벤트 핸들러를 할당하는 것이 아닌, 하위 요소의 공통된 상위 요소에 이벤트 핸들러를 할당해 비슷한 요소를 한번에 다룰 수 있는 개념입니다.
ex)
HTML
<nav class="nav">
<ul class="nav__menus">
<li class="nav__item">
<a class="nav__menu" href="#menu1">menu1</a>
</li>
<li class="nav__item">
<a class="nav__menu" href="#menu2">menu2</a>
</li>
<li class="nav__item">
<a class="nav__menu" href="#menu3">menu3</a>
</li>
<li class="nav__item">
<a>SignUp</a>
</li>
</ul>
</nav>
<section id="menu1">...</section>
<section id="menu2">...</section>
<section id="menu3">...</section>
JS
document.querySelectorAll(".nav__menu").forEach(function (el) {
el.addEventListener("click", function (e) {
e.preventDefault();
const id = this.getAttribute("href");
document.querySelector(id).scrollIntoView({
behavior: "smooth",
});
});
});
위 JS처럼 작성하게 되면 element마다 이벤트 핸들러를 추가 해야하는 문제가 생긴다. 이런 불편함을 해결하기 위해선 공통의 부모 요소인 ".nav__memus"에 이벤트 리스너를 추가하면 아래 하위 요소들에게 이벤트 핸들러를 할당시켜 문제가 해결된다.
해결 JS
document.querySelector(".nav__menus").addEventListener("click", function (e) {
e.preventDefault();
const id = e.target.getAttribute("href");
document.querySelector(id).scrollIntoView({
behavior: "smooth",
});
});
event.stopPropagation()
를 쓸 수 없음.자바스크립트 대부분의 이벤트는 캠쳐링과 버블링 단계를 가진다.
만약 이벤트 리스너에서 3번째 옵션인 capture 옵션이
출처
https://ingg.dev/event-delegation/
https://ko.javascript.info/event-delegation
https://racoonlotty.tistory.com/entry/javascript-이벤트-버블링과-캡처링