Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 컴퓨터과학
- 코딩테스트
- computerscience
- 코테
- 호이스팅
- 국비지원
- 프론트엔드개발자
- 너비우선탐색
- 백준
- 부트캠프
- 패스트캠퍼스
- github
- cpu
- 국비지원취업
- 야놀자
- Javascript
- git
- 자바스크립트
- CSS
- nodejs
- KAKAO
- js
- CS
- 알고리즘
- DFS
- BFS
- LinkSnap
- 컴퓨터공학
- 그리디
- html/css/js
Archives
- Today
- Total
My Boundary As Much As I Experienced
이벤트 위임 본문
이벤트위임이란?
버블링 캡처링을 통한 이벤트 전파를 통해 상위 요소에서 이벤트 핸들링을 하는 것을 말한다.
event.target을 통해 어떤 위치에서 이벤트가 일어났는지 특정할 수 있다.
예시 1
<table>
<tr>
<th colspan="3"><em>Bagua</em> Chart: Direction, Element, Color, Meaning</th>
</tr>
<tr>
<td class="nw"><strong>Northwest</strong><br>Metal<br>Silver<br>Elders</td>
<td class="n">...</td>
<td class="ne">...</td>
</tr>
<tr>...2 more lines of this kind...</tr>
<tr>...2 more lines of this kind...</tr>
</table>
table이 있고 tr, td들이 들어있는 테이블 구조가 있다고 하자. 여기서 원하는 cell(td)을 클릭하면 색상이 바뀌도록 바꾸고 싶다고 하자.
이때 td들에 일일이 다 이벤트 리스너를 부여하는 방식은 매우 코드가 많아지고 반복적인 요소가 많아지게 된다.
그러나 이벤트 위임으로 table에 eventListener를 할당하고, 어디에서 이벤트가 발생했는지를 event.target으로 알아낸다면
더욱 짧은 코드로도 기능을 구현할 수 있다.
table.onclick = function(event) {
let td = event.target.closest('td'); // (1)
if (!td) return; // (2)
if (!table.contains(td)) return; // (3)
highlight(td); // (4)
};
예시 2
<div id="menu">
<button data-action="save">저장하기</button>
<button data-action="load">불러오기</button>
<button data-action="search">검색하기</button>
</div>
td같은것이 아니라 저장하기, 불러오기, 검색하기 등 다른 로직을 실행시키는 버튼에도 적용 가능하다.
menu라는 상위 요소에 eventListener를 할당하고, button들에도 특정할 수 있는 dataset을 추가하던가, class를 추가하는 방식으로 이벤트 위임을 설계할 수 있다.
그리고 event.target이 어떤 부분에서 일어났는지 분기 설정을 통해 원하는 기능을 실행시킬 수 있다.
'FrontEnd > Javascript(Vanilla)' 카테고리의 다른 글
클로저, 렉시컬 스코프 (정리중) (0) | 2023.09.05 |
---|---|
호이스팅의 이유 (0) | 2023.08.29 |
패스트캠퍼스X야놀자 프론트엔드 개발 부트캠프) 사진 관리자 백오피스 서비스 만들기 (0) | 2023.08.28 |
js) 자바스크립트로 체크박스에서 체크된 요소만 모두 찾기 (0) | 2023.08.28 |
JS) some, every, find (0) | 2023.08.28 |