[js] Event Delegation(이벤트 위임)
2021. 7. 6. 23:05ㆍFrontend/JS
** 초보 개발자로 글에 수정해야 할 부분이 있을 수 있습니다. 정정해야 할 부분은 댓글로 소통 부탁드립니다!
효율적인 이벤트 핸들링을 하려면 어떻게 해야할까요?
각 Dom element 마다 이벤트를 거는 것이 아니라
상위의 dom element 에 이벤트를 걸고, 이벤트가 발생한 target 을 찾아 이벤트를 핸들링하는 것입니다.
이러한 방법을 이벤트 위임(Event Delegation)이라고 합니다.
코드로 살펴봅시다!
STEP 01 _ Event Delegation 예제코드
"테이블 내의 td 클릭 시 하이라이트 효과"를 주어야 하는 경우로 가정해봅니다.
1) event.target 사용
$('.table').on('click', (e) => {
let target = event.target; // 클릭이 어디서 발생했을까요?
if (target.tagName != 'TD') return; // TD에서 발생한 게 아니라면 아무 작업도 하지 않습니다
highlight(target); // 강조 함
});
2) event.target.closest 사용
$('.table').on('click', (event) => {
let td = event.target.closest('td'); // (1)
if (!td) return; // (2)
if (!table.contains(td)) return; // (3)
highlight(td); // (4)
});
(1) 가장 가까운 td 를 찾음
(2) td 가 없으면 아무것도 하지 않음
(3) table 내의 td 가 아니라면, 아무것도 하지 않음
(4) 해당 td 를 highlight
3) event delagation + dataset 사용
<button data-toggle-id="subscribe-mail">
구독 폼 보여주기
</button>
<form id="subscribe-mail" hidden>
메일 주소: <input type="email">
</form>
$('.table').on('click', (event) => {
let id = event.target.dataset.toggleId;
if (!id) return;
let elem = document.getElementById(id);
elem.hidden = !elem.hidden;
});
STEP 02 _이벤트 위임의 장점과 단점
1) 장점
- 많은 핸들러를 할당하지 않아도 됨 => 초기화 단순해짐, 메모리 절약, 코드 짧아짐
2) 단점
- 이벤트가 반드시 버블링 되어야 함
- 응답할 필요가 있는 이벤트이든, 아니든 상관없이 모든 하위 컨테이너에서 발생하는 이벤트에 응답해야 함 => CPU 작업 부하 증가 (하지만, 무시할만한 수준임)
[References]
'Frontend > JS' 카테고리의 다른 글
[js] Array 한줄로 초기화 (initialize) 하기 (0) | 2021.07.17 |
---|---|
[js] window.location 객체 (0) | 2021.06.30 |
[js] event 전파 멈추기 (0) | 2021.06.24 |
[js] object to array 변환 (0) | 2021.06.23 |
[js] javascript 깔끔한 코드를 위한 꿀팁 10 (0) | 2021.06.22 |