이벤트 위임(event delegation)

Tony·2021년 8월 24일
0

javascript

목록 보기
26/61

javascript 로 동적으로 넣은 HTML(DOM)은 미리 이벤트 리스너를 설정할 수 없다.

Array를 받아서 카드형태로 리스트를 화면에 그릴 때 javascript로 HTML을 넣는데
이때 이벤트리스너를 미리 설정해 놓을 수 없다.
또 각각 이벤트 리스너를 지정하는 것도 번거로운 일이다.

이럴 경우 이벤트 위임을 이용할 수 있다.

<ul class='list'>
  <li class='card' data-id='1'>
  	<img />
    <h5>card1 title</h5>
    <p>card1 description</p>
  </li>
  <li class='card' data-id='2'>
  	<img />
    <h5>card2 title</h5>
    <p>card2 description</p>
  </li>
  <li class='card' data-id='3'>
  	<img />
    <h5>card3 title</h5>
    <p>card3 description</p>
  </li>
</ul>

위와 같은 구조에서 HTML에 ul만 있고
li는 card는 자바스크립트로 넣어준 형태라고 생각해보자.

javascript에서 렌더링 후 이벤트 리스너를 각각 달아 줄 수 있지만
미리 ul태그에 이벤트 리스너를 달고 그 것이 li카드와 일치할 경우에 이벤트 콜백함수를 실행하는 것이 더 효율적이다.

const list = document.querySelector('.list');

function onClickList(event) {
	let target = event.target;
  	let card = target.closest('li');
  	if(!card) {
     	return; 
    }
  	if(card) {
     	// 실행할 코드 
    }
}

list.addEventListener('click', onClickList);

li에 data-id를 저장해 놨기 때문에 event target이 li를 선택되길 바라지만
실제로 클릭을 하면 그 하위 요소가 선택이 된다.
이럴 경우 event.target.closet('element')로 원하는 element를 선택할 수 있다.

참고 문헌

profile
움직이는 만큼 행복해진다

0개의 댓글