이벤트 위임 패턴
하나의 부모 리스너로 여러 자식 이벤트를 처리합니다.
이벤트 위임 패턴은(는) CoddyKit의 무료 JavaScript Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 JavaScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. JavaScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
모두를 제어하는 하나의 리스너
이벤트 위임은 각각의 자식 요소에 여러 리스너를 붙이는 대신 공통 조상에 하나의 리스너를 붙이는 것을 의미합니다. 이벤트는 버블링되므로 부모는 모든 자손에서 발생한 클릭을 받습니다.
<ul id="menu">
<li>Home</li>
<li>About</li>
<li>Contact</li>
</ul>순진한 접근 방식
위임을 사용하지 않으면 모든 항목을 순회하며 핸들러를 붙여야 합니다. 이는 메모리를 더 사용하므로 낭비이며, 나중에 추가된 요소에는 작동하지 않습니다.
document.querySelectorAll("#menu li").forEach((li) => {
li.addEventListener("click", () => console.log(li.textContent));
});위임을 사용하는 접근 방식
대신 부모에 리스너 하나를 붙이고 event.target을 검사하여 어떤 자식이 클릭되었는지 알아내십시오.
const menu = document.getElementById("menu");
menu.addEventListener("click", (e) => {
console.log(e.target.textContent);
});올바른 대상 찾기
클릭이 중첩된 요소에 도달할 수 있습니다. event.target.closest(selector)를 사용하여 위쪽으로 이동하면서 선택자와 일치하는 관련 조상을 찾으십시오.
menu.addEventListener("click", (e) => {
const item = e.target.closest("li");
if (!item) return; // clicked outside any li
console.log("Clicked:", item.textContent);
});검사로 보호하기
일치하지 않는 클릭은 항상 보호 처리하십시오. if (!item) return;과 같은 조기 종료를 사용하면 사용자가 컨테이너 안의 여백이나 빈 공간을 클릭해도 핸들러가 중단되지 않습니다.
menu.addEventListener("click", (e) => {
const item = e.target.closest("li");
if (!item || !menu.contains(item)) return;
handleSelect(item);
});데이터 속성 사용하기
각 항목에 data-* 속성으로 식별자나 동작을 저장하는 방식이 일반적입니다. 위임된 핸들러는 일치한 요소에서 이 값을 읽습니다.
menu.addEventListener("click", (e) => {
const item = e.target.closest("li");
if (!item) return;
const id = item.dataset.id; // reads data-id
console.log("Selected id:", id);
});동작에 따라 전달하기
버튼이 많은 도구 모음에서는 각 버튼에 data-action을 지정하고 그 값에 따라 분기하십시오. 리스너 하나로 모든 버튼을 처리할 수 있습니다.
toolbar.addEventListener("click", (e) => {
const btn = e.target.closest("button");
if (!btn) return;
switch (btn.dataset.action) {
case "save": save(); break;
case "delete": remove(); break;
}
});확장성이 좋은 이유
위임을 사용하면 1000개의 행이 있는 목록에도 1000개가 아닌 리스너 하나만 필요합니다. 메모리를 덜 사용하고 설정이 빠르며, 행이 변경될 때 정리용 순회도 필요하지 않습니다.
성능 참고 사항
위임에도 작은 비용은 있습니다. 일치하는 이벤트가 발생할 때마다 핸들러가 실행된 후 필터링하기 때문입니다. 대부분의 앱에서는 절약되는 비용에 비해 무시할 수 있는 수준이지만, mousemove처럼 발생 빈도가 매우 높은 이벤트에 대해서는 document에 위임된 리스너를 붙이지 마십시오.
컨테이너 선택하기
모든 대상을 포함하는 가장 가까운 안정적인 조상을 선택하십시오. document에 위임하는 것보다 범위가 좁은 컨테이너(목록 자체)에 위임하는 편이 좋습니다. 관련 없는 이벤트가 핸들러를 실행하는 일이 줄어들기 때문입니다.
const list = document.querySelector(".task-list");
list.addEventListener("click", onTaskClick);closest와 함께 사용하기
closest()는 위임의 핵심입니다. 요소 자체가 일치하면 그 요소를 반환하고, 그렇지 않으면 가장 가까운 일치 조상을 반환하며, 일치하는 요소가 없으면 null을 반환합니다. 따라서 중첩된 마크업에도 안전하게 위임할 수 있습니다.
const cell = e.target.closest("td[data-col]");
if (cell) console.log(cell.dataset.col);빠른 확인
이벤트 위임을 사용하는 이유는 무엇입니까?
복습
이벤트 위임은 부모에 리스너 하나를 붙이고 버블링을 사용하여 모든 자식을 처리합니다. e.target.closest(selector)로 관련 요소를 찾고, 조기 반환으로 보호 처리하며, data-* 속성을 읽어 동작을 전달하십시오. 이 방식은 매우 큰 목록에도 확장할 수 있으며 동적 UI의 표준 패턴입니다.
자주 묻는 질문
“이벤트 위임 패턴” 강의는 무료인가요?
네 — “이벤트 위임 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 JavaScript Academy 강의 전체를 잠금 해제할 수 있습니다. JavaScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“이벤트 위임 패턴”에서 뭘 배우나요?
하나의 부모 리스너로 여러 자식 이벤트를 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 JavaScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
JavaScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 JavaScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“이벤트 위임 패턴” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 JavaScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 JavaScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 캡처 단계와 버블 단계
- 이벤트 위임 패턴
- 위임을 사용한 동적 목록
- 사용자 지정 이벤트