ํฐ์คํ ๋ฆฌ ๋ทฐ
[movie PJ_day5] ์นด๋์ id๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ค์ง? - closest(), getAttribute()
์ฑ._. 2025. 1. 14. 12:18์ด์ ์ํฉ
์ด์ ๋ ์ฌ๋ฌ ํน๊ฐ ์ผ์ ์ผ๋ก ๊ตฌํํ์ง ๋ชปํ๊ณ ๋ฐฉ๋ฒ๋ง ์ ๋ฆฌํด๋จ๋ ๋ด์ฉ์ ์ค๋ ํ๋์ฉ ์คํํด๋ณด์๋ค.

๋จผ์ ,
๋ชจ๋ฌ์ฐฝ์ ํด๋ฆญํ ์ํ์ ์ ๋ณด๋ค์ ๋์ฐ๊ธฐ ์ํด์ ์นด๋์ id๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
ํํฐ๋์ ๋์์ผ๋ก closest()๋ผ๋ ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์นด๋ ์ด๋ ๊ณณ์ ๋๋ฅด๋ ํ๋์ ๋ฌถ์์ผ๋ก ์ฎ์ด์ฃผ์๋ค.
๋ฌธ์ ์ํฉ
์ด์ ํด๋ฆญํ ์นด๋ ์ฆ, e.target์ id๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
for๋ฌธ์ผ๋ก ์ฐ์ด๋ผ ์นด๋์ ํ์์ ์ดํด๋ณด์๋ค.
for (let i = 0; i < posts.length; i++) {
temp_html += `
<div data-id="${posts[i].id}" class="mvCard">
<img id="poster" src="${
baseImgUrl + posts[i].poster_path
} class="card-img-top alt="poster">
<p>${posts[i].title}</p>
<p>ํ์ : ${posts[i].vote_average}<span id="mvaver"></span></p>
</div>`;
}
์ฌ๊ธฐ์ data-id๊ฐ ํ์ํ๋ค!
JavaScript์ ์์์์ ์์ฑ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ผ๋ก getAttribute() ํจ์๋ฅผ ์๊ฒ ๋์๋ค.
๐getAttribute ๋?
DOM ์์์์ ์์ฑ ๊ฐ์ ๊ฐ์ ธ์ค๋ ํจ์์ด๋ค.
์ฃผ์ด์ง ์์์์ ์์ฑ์ด ์กด์ฌํ ๊ฒฝ์ฐ, ๊ทธ ์์ฑ์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
์์)
[HTML]
<video src="video.mp4" autoplay></video>
[JavaScript]
const myVideo = document.querySelector("video");
/* ์์ฑ์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ฐํ */
console.log(myVideo.getAttribute("src")); // "video.mp4"
/* ์์ฑ์ ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋น ๋ฌธ์์ด("")์ ๋ฐํ */
console.log(myVideo.getAttribute("autoplay")); // ""
/* ํด๋น ์์์ ์ผ์นํ๋ ์์ฑ์ด ์๋ค๋ฉด null์ ๋ฐํ */
console.log(myVideo.getAttribute("loop")); // null
์ถ์ฒ: getAttribute ํจ์
๋ฐ๋ผ์ ๋ณ์ cardID๋ฅผ ์ ์ธํ์ฌ
const cardID = e.target.getAttribute("data-id");
console.log(cardID);
๋ฅผ ์คํํ์์ง๋ง ์ฝ์ ์ฐฝ์๋ 'null'์ด ๋ด๋ค. ์์ง?

"data-id" ๋์ ๋ค๋ฅธ ์์๋ค์ ๋ฃ์ด๋ดค๋ค.
"id"๋ฅผ ๋ฃ์ด๋ณด๋ poster๊ฐ ๋ด๋ค. ์ด๋ img ํ๊ทธ์ ์๋ id ๊ฐ์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.

๊ทธ๋ ๋ค๋ฉด, data-id๋ฅผ img ํ๊ทธ์ ๋ฃ์ด๋ณผ๊น?

data-id ๊ฐ ์ ๋จ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ผ, ์ divํ๊ทธ์์๋ ์ ๋จ๋ ๊ฒ์ด img ํ๊ทธ์์๋ ์ ๋จ๋ ๊ฒ์ผ๊น??
๋ฌธ์ ํด๊ฒฐ
cardSection.addEventListener("click", function (e) {
console.log(e.target.closest(".mvCard"));
์ด ๋ก์ง์ ๋ค์ ํ ๋ฒ ์์ธํ ์ดํด๋ณด์.
๐closest ๋ฉ์๋๋?
์ฃผ์ด์ง CSS ์ ํ์์ ์ผ์นํ๋ ์์๋ฅผ ์ฐพ์ ๋๊น์ง
์๊ธฐ ์์ ์ ํฌํจํด ์์ชฝ(๋ถ๋ชจ ๋ฐฉํฅ, ๋ฌธ์ ๋ฃจํธ๊น์ง)์ผ๋ก ๋ฌธ์ ํธ๋ฆฌ๋ฅผ ์ํํ๋ค.
์ถ์ฒ:closest ๋ฉ์๋
์๋ฅผ ๋ค์ด
๋ด๊ฐ ๋ง๋ for๋ฌธ ๋ด์ temp ์นด๋ ๋ก์ง์ ๋ณด๋ฉด
temp_html += `
<div data-id="${posts[i].id}" class="mvCard">
<img id="poster" src="${
baseImgUrl + posts[i].poster_path
} class="card-img-top alt="poster">
<p>${posts[i].title}</p>
<p>ํ์ : ${posts[i].vote_average}<span id="mvaver"></span></p>
</div>`;
<img> ๋ฅผ ํด๋ฆญํ๋, <p>๋ฅผ ํด๋ฆญํ๋ ๋ชจ๋ <div>๋ก ์ธ์ํ๋ค๋ ๊ฒ์ด๋ค.
์๋ํ๋ฉด <div>์ class๋ฅผ ์ฃผ์๊ณ , ์ด๋ฅผ CSS์์ ํ์ฉํ๊ธฐ ๋๋ฌธ!
๋ฐ๋ผ์ getAttribute๋ฅผ e.target์์ ์คํํ ๊ฒ ์๋๋ผ mvCard์ด์๋ค.
cardSection.addEventListener("click", function (e) {
console.log(e.target.closest(".mvCard"));
const mvCard = e.target.closest(".mvCard");
const cardID = mvCard.getAttribute("data-id");
console.log(cardID);
});
๐๐ปํต์ผ๊ฐ ์๊ฒ ์ ๋ฆฌํ๋ค.
cardSection.addEventListener("click", function (e) {
const mvCard = e.target.closest(".mvCard");
const cardID = mvCard.getAttribute("data-id");
});
์ฐธ๊ณ :
https://developer.mozilla.org/ko/docs/Web/API/Element/closest
'Forntend > Trouble Shooting' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Live Server ์ค๋ฅ ๋ฐ ํด๊ฒฐ๋ฐฉ๋ฒ - vscode ์ด๊ธฐํ(๋ ๋ฌด์์) (0) | 2025.01.19 |
|---|---|
| ๋ถ๋งํฌ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ(1) - ์ด๋ฒคํธ ์์ (0) | 2025.01.15 |
| ๋ชจ๋ฌ์ฐฝ ๋ซ๊ธฐ ๋ฒํผ ์ค๋ฅ - innerHTML ์ฌ์ฉ ์ ์ด๋ฒคํธ๋ฆฌ์ค๋ ์ค๋ฅ (0) | 2025.01.15 |
| [movie PJ_day4] ์ํ ๊ฒ์ ํ์ด์ง ๊ตฌํ - ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ (0) | 2025.01.13 |
| for๋ฌธ์ด ๋จ์ง ์๋๋ค. ์??? (0) | 2025.01.12 |