개발노트/TroubleShooting
[jQuery] 동적 요소에 이벤트 바인딩이 안 될 때 해결법 (+ event delegation)
dev-mylee
2025. 1. 18. 15:29
오늘 댓글 삭제 기능 구현하다가 생긴 TroubleShooting 정리...🥲
# 문제상황
댓글 삭제 버튼에 이벤트를 아래처럼 걸었는데 아무리 눌러도 반응이 없었다.
$("#btnDelete").on("click", function(e){
var commentIdx = $(this).closest("tr").find("input[name='commentIdx']").val();
if(!commentIdx){
alert("댓글을 찾을 수 없습니다.");
return;
}
location.href = "/comment/delete/" + commentIdx;
});
# 원인
알고보니 동적으로 생성된 요소에는 이벤트가 바인딩이 안 되는 문제였다.
페이지 로드 시점에 이미 있는 요소들에만 이벤트가 걸리고, 나중에 동적으로 추가된 요소들에는 이벤트가 적용이 안 됨.
# 해결방법
- 이벤트 위임(Event Delegation) 사용
부모 요소에 이벤트를 걸고, 실제 클릭된 요소를 찾아가는 방식으로 해결
$(document).on("click", "#btnDelete", function(e){
var commentIdx = $(this).closest("tr").find("input[name='commentIdx']").val();
if(!commentIdx){
alert("댓글을 찾을 수 없습니다.");
return;
}
location.href = "/comment/delete/" + commentIdx;
});
# 작동원리
- document에 이벤트 리스너 등록
- 클릭 이벤트 발생하면 이벤트 버블링으로 document까지 전파
- 선택자와 일치하는지 확인 (#btnDelete)
- 일치하면 핸들러 실행
# 주의사항
- 동적 요소는 무조건 이벤트 위임 방식으로 구현하기
- document 말고 가까운 부모 요소에 걸어주는게 성능상 좋음
- this는 실제 클릭된 요소를 가리킴
이거 하는데 1시간 걸렸다... 다음엔 까먹지 말자 😭