[JavaScript] 이벤트 위임(event delegation)

빵호·2021년 8월 11일
0
post-thumbnail

시작 전 주절주절

인스타그램 클론 코딩 중 댓글 추가 기능을 구현하고 추가로 댓글 삭제 및 좋아요 기능을 구현하고 있었다.

시작 전에는 새로 추가된 태그에 이벤트를 추가하면 되겠네 이 정도면 쉽지~ 😗 라고 생각을 했는데

막상 시작을 해보니 DOM을 통해 새로 추가된 태그에 이벤트를 넣는 게 생각보다 쉽지는 않았다.

삽질한 코드는 잘 기억이 나지는 않지만 해당 클래스에 for 문 그 안에 이벤트를 추가한 거 같다.

for (i = 0; i < Comment[i].lentgth; i++ {
  Comment[i].addEventlistener("click", () => {
	if (src === heart) {
    	src = redHeart
    } else {
     	src = heart
    	}
  }
}

위 코드처럼 작성을 하니 자바스크립트가 불러와지는 순간 실행이 되어 HTML로 미리 작성한 태그에만

좋아요 와 삭제 기능이 추가가 되고 DOM을 통해 추가된 태그에는 적용이 되지 않았다. 그래서 점심시간에

동기분에게 '댓글 삭제랑 좋아요 기능을 추가하는데 어떻게 해야 할지 모르겠다 머리가 아프다.'라고 하니

바로 이 이벤트 위임(event delegation)에 대해 말씀해 주셔서 기능들을 잘 추가할 수 있었다.

이벤트 위임(event delegation)

이벤트 위임은 비슷한 방식으로 여러 요소를 다뤄야 할 때 사용하면 된다. 이벤트 위임을 사용하면 요소마다

이벤트를 추가하지 않고 요소의 공통 조상에 이벤트 핸들러 하나만 추가해도 여러 요소에서 사용이 가능하다.

HTML

<div class="comment">
    <div>
        <span class="boldFont">bbangho</span> 한강 다녀감~✌️
    </div>
    <div>
        <span class="boldFont">manja</span> 한강 갱~ 🔫 🔫
        <img class="commentDelete" alt="댓글 삭제" src="./img/garbage.png">
        <img class="commentHeart" alt="댓글 하트" src="./img/heart.png">
        <div>42분 전</div>
    </div>
</div>   

JS

comment.addEventListener("click", (event) => {
    const src = event.target.getAttribute("src")
    const heart = "./img/heart.png"
    const redHeart = "./img/redHeart.png"
    const deleteIcon = "./img/garbage.png"

    if (src === heart) {
        event.target.src=redHeart;
    } else if (src === redHeart) {
        event.target.src=heart;
    }

     if (src === deleteIcon) {
        event.target.parentNode.remove()
     }
});

위 코드는 내가 이벤트 위임을 통해 좋아요 기능과 댓글 삭제 기능을 구현한 코드이다.

HTML로 미리 추가한 댓글과 DOM을 통해 추가될 댓글의 공통 조상에 addEventListener를 추가하고

event.target 을 통해 클릭 이벤트가 발생한 요소를 찾는다. 그리고 .getAttribute()

해당 요소의 속성값을 확인해 빈 하트는 빨간색 하트로, 빨간색 하트는 빈 하트로 사진을 바꾸는 좋아요 기능과

삭제 아이콘을 누르면 해당 요소의 부모 노드가 삭제되는 코드를 통해 댓글을 삭제하는 기능을 완성하였다.

구현 영상

profile
늘 한결같이 꾸준히

0개의 댓글