- Published On
이벤트 위임(Event Delegation)
이벤트 위임(Event Delegation)
1. 이벤트 위임이란 무엇인가요?
웹사이트를 만들다 보면 페이지 안에 버튼이나 입력창 같은 여러 요소
가 필요합니다.
그런데 이런 요소가 많아질수록 효율적인 이벤트 관리
가 필요합니다.
이벤트 위임(Event Delegation)
은 이런 문제를 해결해주는 똑똑한 방법입니다.
간단히 말해, 여러 요소마다 이벤트를 붙이는 대신 부모 요소 하나에만 이벤트를 붙이는 방법
입니다.
그러면 새로 생기는 요소도 자동으로 이벤트를 적용할 수
있습니다.
2. 왜 이벤트 위임을 사용할까요?
아래 표로 이벤트 위임
이 왜 좋은지 비교해볼까요?
이벤트 위임 사용 안 함 | 이벤트 위임 사용 시 |
---|---|
각 요소마다 이벤트를 따로 붙여야 함 | 부모 요소에만 이벤트 하나를 붙이면 됨 |
새로 추가된 요소에는 따로 이벤트를 붙여야 함 | 새로 추가된 요소도 자동으로 이벤트 처리됨 |
이벤트가 많아질수록 메모리 사용이 늘어남 | 메모리를 효율적으로 사용할 수 있음 |
3. 예제로 이해하기
이제 예제를 통해 더 쉽게 이해해봅시다.
아래와 같이 버튼 3개가 있는 HTML을 준비했습니다.
목표는 각 버튼을 클릭했을 때 '클릭됨!' 이라는 메시지를 콘솔에 출력하는 것입니다.
<div id="button-container">
<button>버튼 1</button>
<button>버튼 2</button>
<button>버튼 3</button>
</div>
이벤트 위임 없이 구현하기
각 버튼에 개별적으로 이벤트 리스너를 추가하면 아래와 같은 코드가 됩니다.
document.querySelectorAll("button").forEach((button) => {
button.addEventListener("click", function () {
console.log("클릭됨!");
});
});
- 문제점
- 버튼이 많아질수록 이벤트 리스너도 많이 추가되어 성능이 저하될 수 있습니다.
- 만약 새로운 버튼이 동적으로 추가되면, 그 버튼에는 이벤트 리스너를 따로 추가해야 합니다.
이벤트 위임을 사용해 구현하기
이제 부모 요소인 #button-container 에 이벤트 리스너를 하나만 추가해보겠습니다.
document
.getElementById("button-container")
.addEventListener("click", function (e) {
// 클릭된 요소가 버튼인지 확인합니다.
if (e.target.tagName === "BUTTON") {
console.log("클릭됨!");
}
});
동작 방식
- 부모 요소인 #button-container에 이벤트 리스너를 한 번만 추가합니다.
- 사용자가 버튼을 클릭하면 이벤트가 부모 요소로 전달됩니다.
- 이벤트가 발생한 요소(e.target)가 버튼인지 확인한 후, '클릭됨!' 메시지를 출력합니다.
4. 이벤트 위임의 장점 정리
- 코드가 간결해집니다.
- 여러 요소에 각각 이벤트를 붙일 필요가 없습니다.
- 동적으로 추가된 요소도 자동으로 이벤트가 적용됩니다.
- 메모리를 효율적으로 사용해 성능이 개선됩니다.
이전 포스트
자바스크립트의 ES6 주요 변경 사항연관된 포스트 구경가기
1. AJAX란 무엇인가?2. 자바스크립트의 ES6 주요 변경 사항3. 이벤트 위임(Event Delegation)4. 실행 컨텍스트(Execution Context)5. 자바스크립트의 new 연산자 동작 방식6. JavaScript의 연산자 비교7. 엄격 모드(Strict Mode)8. JavaScript의 프로토타입 (Prototype) 이해하기9. Javascript에서 URL 및 URLSearchParams 사용10. Fetch web API11. 타입스크립트 주요 타입 정리12. import vs require13. JavaScript의 비동기 처리14. HTML SVG태그 분석15. JavaScript의 this 바인딩 완벽 정리16. JavaScript 배열 메서드: reduce()와 sort() 분석17. JavaScript 배열 메서드와 고차 함수 총정리
간략히