요소에 이벤트를 등록하는 일반적인 방법은 요소에 addEventListener()를 등록하는 것.
그렇다면 만약 100개의 요소에 이벤트를 등록하고 싶다면...? 🤔
- 이벤트 흐름을 잘 이용한다면 단 1개의 이벤트 리스너로 수 많은 요소의 이벤트를 처리할 수 있다!
<button>
태그를 클릭했다면?브라우저는 이벤트가 발생한 button 태그를 찾기 시작할 것이고, 이벤트 1) 캡처링과 2) 버블링을 통해 button 태그의 부모 요소인 div의 이벤트 리스너를 실행시킬 것이다.
event.currentTarget : 이벤트가 등록된 요소를 가르킴
<div>.addEventListener('click', function(event){});
event.currentTarget() === <div> // 이벤트가 등록된 요소
event.target() === <button> // 이벤트가 최초에 발생한 요소
<div class="parent">
Output
<button>generate item</button>
<ul>
<li>initial item</li>
</ul>
</div>
<script>
const parentEl = document.querySelector('.parent');
const ulEl = document.querySelector('ul');
parentEl.addEventListener('click', (e) => {
if (e.target.tagName.toLowerCase() === "button") {
const newEl = document.createElement('li');
newEl.innerText = "hello world~";
ulEl.appendChild(newEl);
}
if (e.target.tagName.toLowerCase() === "li") {
console.log('hit!!!' + e.target.innerText);
}
});
</script>
즉, 이벤트를 발생시키고 싶은 요소를 이벤트 리스너가 설치된 부모 요소의 자식으로 배치한다면
그 요소가 몇 개든 상관 없이 이벤트를 등록할 수 있음
또한 요소가 동적으로 생성되어 계속 추가 되어도 같은 기능을 유지함
이렇게 이벤트 흐름을 활용하여 단일 이벤트 리스너가 여러개의 이벤트 대상을 처리할 수 있게 하는 프로그래밍을 이벤트 위임이라고 함!