문제설명
let temp_html = `<div class="flip-box" onclick="select(${id})">
<div class="flip">
<div class="front">
<div class="img-cut">
<img src="https://image.tmdb.org/t/p/original/${img}"
class="card-background">
<img src="https://image.tmdb.org/t/p/original/${img}"
class="card-img">
</div>
<h5 id="movie_title" class="card-title">${title}</h5>
</div>
<div class="back">
<p class="card-grade">-${grade}-</p>
<p class="card-text">${overview}</p>
</div>
</div>
</div>`;
document.querySelector("#cards-box").insertAdjacentHTML("beforeend", temp_html)
맨 위 코드, <div class="flip-box" onclick="select(${id})">는 fetch로 가져온 모든 데이터에 onclick()을 할당한다.
이는 가져온 데이터의 개수가 많아질 수록 메모리의 낭비를 초래하는 코드다.
이를 방지하고자 더 효율적인 코드로 개선하고 싶다.
시도
이벤트 버블링이라는 현상이 있다. 이는 하위 요소에서 발생한 이벤트가 상위 요소로 전파되는 현상을 의미한다.
즉 템플릿의 최상위 요소인 `<div class="flip-box" onclick="select(${id})">에 "select(${id})함수를 넣는게 아니라
document.querySelector("#cards-box"), 템플릿의 상위 div인 class=cards-box를 활용해서 하위 요소의 event를 받아오는
코드를 짤 생각이다.
해결
function handleClickCard({ target }) {
if (target === cardList) return;
if (target.matches(".movie-card")) {
alert(`영화 id: ${target.id}`);
} else {
alert(`영화 id: ${target.parentNode.id}`);
}
}
};
먼저 event를 받는 함수를 만든다. if (target === cardList) return; 이 함수로 카드 영역 외의 클릭 event를 방지한다.
target.matches(".movie-card") 카드를 클릭하거나 else {alert(`영화 id: ${target.parentNode.id}`);} 그 밖의 요소를 클릭할 때
alert가 발생한다.
const cardList = document.querySelector("#card-box");
cardList.addEventListener("click", handleClickCard);
마지막으로 card-box를 cardList에 할당하고 event 함수를 부여하면 된다.
알게된 점
같은 기능을 하는 함수를 반복해서 할당하면 메모리의 낭비가 생긴다는 것을 알았다.
하위요소에서 발생한 이벤트가 상위요소까지 전달되는 이벤트 버블링의 현상에 대해서 알 수 있었다.
'T.I.L' 카테고리의 다른 글
23-06-07 T.I.L filter와 find (0) | 2023.06.07 |
---|---|
23-06-06 T.I.L innerHTML과 map (0) | 2023.06.06 |
23-06-01 T.I.L position: relative / absolute (0) | 2023.06.02 |
23-05-31 T.I.L indexOf로 disply, block / none 활용하기 (0) | 2023.05.31 |
23-05-30 T.I.L querySelectorAll(#id), 노드배열 리스트 화 (0) | 2023.05.30 |