일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 그리디
- 코어자바스크립트
- 자바스크립트
- Supabase
- 리액트 라우터 돔
- 토이프로젝트
- 프로그래머스
- 동적계획법
- react pattern
- reduxtoolkit
- tanstack query
- 토이 프로젝트
- 리덕스
- tailwind
- Form
- 코딩테스트
- 프론트엔드
- 코테
- TypeScript
- styled component
- JavaScript
- React
- react router dom
- React Query
- 타입스크립트
- 리액트
- 리액트 패턴
- revalidatepath
- Next.js
- 스택
- Today
- Total
느려도 한걸음씩
DOM - 이벤트 위임(Event Delegation) 본문
이벤트 위임이란 이벤트가 발생할때 이벤트 버블링에 의해 document 레벨까지 버블링 되어 올라가는데
이 때문에 자식 element에서 발생하는 이벤트를 부모 element에서도 감지할 수 있다
이러한 작동 방식을 이용해 모든 자식 엘리멘트에 이벤트를 주는 것이 아닌 부모에게만 이벤트를 위임하는 방법이다
<div class="btn__container">
<button class="button">1</button>
<button class="button">2</button>
<button class="button">3</button>
</div>
버튼 컨테이너 안에 3개의 버튼이 있고 버튼을 누를때마다 알림창이 뜨는 기능을 만들고싶다고 치자 그렇다면 어떻게 해야할까?
const buttons = document.querySelectorAll('.button');
buttons.forEach(button =>
button.addEventListener('click', () => alert('This is button'))
);
querySelectorAll을 이용해 button 클래스를 가진 모든 요소를 선택하고 반복문을 통해 모든 버튼에 이벤트 리스너를 달아주면 된다 이번엔 이벤트 위임을 통해서 기능을 개발해보자
const btnContainer = document.querySelector('.btn__container');
btnContainer.addEventListener('click', e => {
if (e.target.classList.contains('button')) {
alert('This is button');
}
});
모든 버튼에 이벤트리스너를 다는것이 아닌 이벤트 버블링이 되는것을 이용해 버튼 컨테이너 하나에만 이벤트리스너를 부달아준다 그후 해당 이벤트의 클래스에 button 클래스가 있는 요소를 클릭할때만 알람창이 뜨게 해준다
이렇게 이벤트 위임을 사용하면 얻는 이점이 뭘까?
1.메모리 효율성: 각각의 버튼에 이벤트 리스너를 따로 추가하지 않고, 부모 요소 하나에만 리스너를 추가하므로 메모리 사용이 줄어든다, 버튼이 3개가 아니라 100만개가 있다고 생각해보자 그 100개의 버튼에 모두 이벤트 리스너를 달면 메모리를 상당히 많이 써야할것이다.
2.유연성: 동적으로 버튼을 추가하거나 제거할 경우에도 별도로 이벤트 리스너를 추가할 필요 없이, 부모 요소에 추가된 하나의 리스너로 모든 자식 버튼의 이벤트를 처리할 수 있다.
3.유지보수성: 코드가 간결해지고, 동일한 이벤트 처리를 여러 곳에 추가하지 않아도 되어 유지보수가 쉬워진다
'FE develop > Javascript' 카테고리의 다른 글
자바스크립트 비동기 이해하기 - (2) 비동기 콜백 (0) | 2025.04.16 |
---|---|
자바스크립트 비동기 이해하기 - (1) 동기 vs 비동기 (0) | 2025.04.16 |
원하는 곳으로 스크롤하기 - (getBountdingClientRect , scrollTo, scrollIntoView) (0) | 2024.10.20 |
자바스크립트에서 특수문자 표시하기 (1) | 2024.08.02 |
import / export 문법 (0) | 2024.03.26 |