자바스크립트에서의 이벤트 위임(Event Delegation)
❓ 이벤트 위임이란
이벤트위임은 이벤트 핸들링 패턴 중 하나로, 요소마다 이벤트 핸들러를 할당하지않고, 요소의 공통의 조상에서 이벤트 핸들러를 할당해 사용하는 방식이다.
이벤트 위임
1. 메모리 사용량 감소
2. 동적인 요소 처리
3. 코드 유지보수 용이성
이벤트 위임을 사용하지 않고 각각의 노드에 핸들러에 할당한 코드
button
들에게 이벤트를 연결해야하는 반복적인 로직이 사용되고 있다.
/* html */
<div id="buttons-container">
<button id="button-1">Button 1</button>
<button id="button-2">Button 2</button>
<button id="button-3">Button 3</button>
</div>
/* js */
document.getElementById('button-1').addEventListener('click', function() {
handleClick(1);
});
document.getElementById('button-2').addEventListener('click', function() {
handleClick(2);
});
document.getElementById('button-3').addEventListener('click', function() {
handleClick(3);
});
function handleClick(buttonId) {
// 버튼 클릭 처리 로직
}
해당 코드를 이벤트 위임을 사용해서 리팩토링하면?
buttons-container
에 이벤트핸들러 등록handleClick
함수 내부에서 event.target.matches('button')
를 사용해, 클릭된 엘리튼트가 버튼인지 확인하고, 클릭된 엘리먼트가 버튼일 경우, 해당 버튼 클릭에 대한 로직을 공통적으로 처리할 수 있다.
/* html */
<div id="buttons-container">
<button id="button-1">Button 1</button>
<button id="button-2">Button 2</button>
<button id="button-3">Button 3</button>
</div>
const container = document.querySelector('.buttons-container')
const handleClick = (e) => {
if(e.target.matches('button')){
//버튼 클릭 이벤트 로직 추가
}
}
container.addEventListener('click', handleClick)
🥝 이벤트 위임 구현시 사용할 수 있는 메서드는 아래 소개되는것 외에도 더 다양하다!
1. closet()
closet ()
현재 요소 자신 그리고 자신요소 부터 상위로 탐색하여 가장 가까운 조상요소를 찾을 수 있다.null
을 반환한다const handleClick = (e) => {
const button = e.target.closest('button');
if (button) {
// 버튼 클릭에 대한 로직
}
};
2. matches()
matches()
는 DOM 엘리먼트
가 주어진 선택자와 일치하는 지 확인한다 (Boolean
값 반환)
const handleClick = (e) => {
const button = e.target.matches('button')
if (button) {
// 버튼 클릭에 대한 로직
}
};