์ฃผ์!โจ
์ด ๊ธ์ ๊ฐ๋ฐ์ ๋ฐฐ์๊ฐ๋ ์ด๋ณด ๊ฐ๋ฐ์ ์์ฑํ๋ ์ผ์ข ์ ๊ณต๋ถ๊ธฐ๋ก์ ๋๋ค.
ํ์ ์์ ์ผํ์๋ ๋ถ๋ค์ด๋ ์ ์๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ์์ ์ ์์ต๋๋ค!
JavaScript
๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ด๋ฒคํธ ๋ฑ์ ์์ฃผ ์ด์ฉํ๋ค ๋ณด๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ผ๋ก ์ธํด์ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒฝ์ฐ๋ ์์๊ณ ์ด๋ฅผ ์ด์ฉํด์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค. ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋ํด์ ํ๋ฒ ์ ๋ฆฌํด๋ณด์.
์บก์ฒ๋ง์ ๋จ์ํ๊ฒ ๋งํด์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ฐ๊นฅ ์์๋ถํฐ ํด๋นํ๋ ์์๊น์ง ์ฐพ์๋ค์ด๊ฐ๋ ๊ณผ์ ์ ๋งํ๋ค. ์ฆ ๋ง์ฝ <Body>
ํ๊ทธ ์์ ์๋ <div>
์์ ์๋ <span>
์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด์ <html>
=> <body>
=> <div>
=> <span>
์ ์์๋ก ์ฐพ์๊ฐ๊ฒ ๋๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๊ฑฐํ์ด ์๊ธฐ๋ฉด์ ๋ฌผ ์๋ก ์ฌ๋ผ๊ฐ๋ ์ด๋ฏธ์ง๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ์ดํดํ๋๋ฐ ๋์์ด ๋๋ค. ๋ง์ฝ HTML ์์ ์ด๋ค ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋๊ฒ ๋๋ฉด ์บก์ฒ๋ง์ ํตํด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ณณ์ ์ฐพ๊ณ ์ญ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์์ ์์๋ก ์ ํ ๋๋ค. ์ฆ, ์ ์ผ ํ๋จ์ ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ์ด ์ด๋ฒคํธ๊ฐ ๋ชจ๋ ๋ถ๋ชจ, ์กฐ์์์์๋ ์ ํ๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค. ์ดํดํ๊ธฐ ํธํ๊ฒ ์์๋ฅผ ๋ค์ด๋ณด์.
<!-- html ๋ฌธ์ ์์ -->
<body>
<div class = "div1">
<ul class = "ul1">
<li class = "li1"></li>
<li class = "li1"></li>
</ul>
</div>
</body>
// ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๊ด์ฐฐํ๊ธฐ
div1.addEventListener("click", () => {
console.log("Div");
})
ul1.addEventListener("click", () => {
console.log("Ul");
})
li1.addEventListener("click", () => {
console.log("Li");
})
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๊ฐ ์์๋ค์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด์ฃผ์๋ค. ๋ง์ฝ ์ฌ๊ธฐ์ <li>
๋ฅผ ํด๋ฆญํ๊ฒ ๋๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ๋ณด์.
๋ถ๋ช li1์ ์๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ง ๋์์ ํด์ผํ์ง๋ง ๋ถ๋ชจ ์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ํ ๋์ํ๋ค. ์ฒ์์ ์ค๋ช ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ด๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ผ๋ก ์ธํด์ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ์์๊น์ง ์ ํ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฐ ์ด์ ๋๋ฌธ์ ๋ถ๋ชจ ์์์๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด์ผํ๋ ๊ฒฝ์ฐ์๋ ์ฃผ์๊ฐ ํ์ํ๋ค.
์ด๋ฒคํธ๋ค์ด ๋ฒ๋ธ๋ง ๋๋ค๋ณด๋ฉด ์์ํ์ง ๋ชปํ ์ผ๋ค์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์ ์ดํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ด๋ฒคํธ ๊ฐ์ฒด์๋ stopPropagation()์ด๋ผ๋ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ ์ ์๋๋ฐ ์ด๊ฒ์ ํธ์ถํ๋ฉด, ํธ์ถ๋ ์ด๋ฒคํธ๊น์ง๋ง ํธ์ถ์ด ๋๊ณ ๊ทธ ์๋ก๋ ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ์ ๋์ง ์๊ฒ ๋๋ค.
// ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๊ด์ฐฐํ๊ธฐ
div1.addEventListener("click", () => {
console.log("Div");
})
ul1.addEventListener("click", (e) => {
console.log("Ul");
e.stopPropagation(e);
})
li1.addEventListener("click", () => {
console.log("Li");
})
์์ ๋๊ฐ์ ์ํฉ์์ ul1
์ e.stopPropagation(e)
๋ฅผ ํธ์ถํด์ฃผ์๋ค.
๊ทธ ๊ฒฐ๊ณผ ul
์ ๊ฐ๊น์ง๋ง ์ถ๋ ฅ๋๊ณ ์์ ์์์ ๊ฒฝ์ฐ ์ ํ๊ฐ ๋ง์์ง ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ฒ์์๋ ๋งค์ฐ ์ข์ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ๋ค. "์ด๋ฒคํธ์ ์ ํ๋ฅผ ๋ง์์ฃผ๋ค๋ ๋ง๋ฅ์ด์๋!!" ํ์ง๋ง, ๋ง์ฝ... ๋์ผํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ค๋ฅธ ๋์์ ์ํ๋ ๋ก์ง์ด ํ์ํ๋ค๋ฉด? ๋งค์ฐ ๊ณค๋ํ ์ํฉ์ ๊ฒช์ ์ ์๋ค. ๊ฒ๋ค๊ฐ ๊ฐ๋ฐ์ ๋ ํผ์๋ง ๋ณด๊ณ ๋ง๋ค๊ณ ๋๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ ์ด๋์ ์ฝ๋๊ฐ ๋๊ตฐ๊ฐ์ ๋ก์ง์ ๋ฐฉํดํ ์๋ ์๋ค.
์น๋ช
์ ์ธ ๋ฌธ์ ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ํด์ ๋ด๋ณด์. event.preeventDefault()
๋ ์ด๋ฒคํธ์ ์ ํ๊ฐ ์๋ ์ด๋ฒคํธ์ ์ฒ๋ฆฌ๋ฅผ ์ทจ์ํ ์ ์๋ ๋ฉ์๋์ด๋ค. ๋ค๋ง, ์ทจ์ํ ์ ์๋ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ๋ค.
๊ฐ๋จํ๊ฒ ์๋ฅผ ๋ค๋ฉด ์ฒดํฌ ๋ฐ์ค์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ทจ์์์ผ์ ์ฒดํฌ๊ฐ ๋์ง ์๋๋ก ๋ง๋ ๋ค๊ฑฐ๋ ์ธํ์ฐฝ์ ์๋ ํค์ ๋ ฅ ์ด๋ฒคํธ๋ฅผ ์ทจ์์ํค๊ณ ํน์ ์ํ๋ ์ธํ๋ง ์ ๋ ฅ๋๋๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ด๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋์ด์ง ๋ฒ๋ธ๋ง์ ๋ง๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด๊ธฐ๋ ์ด๋ ต๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
if(e.target !== e.currentTarget){
return;
}
๋ฐ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ฅผ ๋ํ๋ด๋ event.target
๊ณผ ํ์ฌ ์ด๋ฒคํธ๊ฐ ์ ํ๋๊ณ ์๋ ์์น์ธ e.currentTarget
๊ฐ ๋์ผํ์ง ์์ ๊ฒฝ์ฐ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ข
๋ฃํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ง๋ ์ง ์ํ๋ ๋ก์ง์ ์ถ๊ฐ๋ก ๊ตฌ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๋ค.
// ๋๊ธ ์์ด์ฝ ๋ฒํผ ๊ธฐ๋ฅ ๊ตฌํ
feeds.addEventListener("click", (event) => {
if(event.target.tagName !== "I"){
return;
}
onHeartClick(event);
onDelete(event);
})
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๊ผญ ๋์ ๋ฌธ์ ์ธ ๊ฒ์ ์๋๋ค. ์์ ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ถ๋ชจ์์๊น์ง ๋ฒ๋ธ๋ง ๋๋ ๊ฒ์ ์ด์ฉํด์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ์์ ์ฝ๋๋ ๊ทธ ์์์ด๋ค.
feeds
๋ ์ธ์คํ๊ทธ๋จ์ ํผ๋๋ค์ ํฌํจํ๊ณ ์๋ ์์์ด๋ค. ์ฌ๊ธฐ์ ํด๋ฆญ ์ด๋ฒคํธ์ ๋ํ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ์๋ค. ๊ทธ๋ฆฌ๊ณ event.target
์ ํ๊ทธ ๋ค์์ด I
์ด ์๋ ๊ฒฝ์ฐ์ ํจ์๋ฅผ ์ข
๋ฃํ๋๋ก ํ๋ค. ๋ง์ฝ ์์ด์ฝ์ด ์ ๋๋ก ์ ํ ๋์ด์ ํจ์๊ฐ ์ข
๋ฃ๋์ง ์์๋ค๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ onHeartClick
๊ณผ onDelete
๋ผ๋ ํจ์๋ฅผ ์คํํ๋๋ก ํ์๋ค. ๋์์ ์๋์ ๊ฐ๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ ๋ ํธํ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ค ์ ์๋ค. ๋ํ, ์ ์ญ๋ณ์์ ์ ์ธ์ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ญ ๊ณต๊ฐ์ ๋ํด์๋ ์ด๋์ ์ทจํ ์ ์๋ค.
โจ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์์ด์ ์ฃผ์ํ ์ ์ ๋ํด์ ํญ์ ๊ธฐ์ตํ๋ฉด์ ํจ์จ์ ์ธ ๋ก์ง์ ๋ํด ๊ณ ๋ฏผ์ ๋ ํด๋ณด์. ๐ช
๐ ์ฐธ๊ณ : MDN
console.log ์์ ๋๋ถ์ ํท๊ฐ๋ฆด ์ ์๋ ๊ฐ๋ ์ด ์์ ๋ค์ด์ค๋ค์๐ค target๋ผ๋ฆฌ ๋น๊ตํ๋ ๋ฐฉ๋ฒ๋ ๋งค์ฐ ์ ์ฉํ๊ฒ ๋ณด์์ต๋๋ค! ์์ ์์๋ฅผ ์ฐพ์ ํด๋ฆญํ ๋์ ์ด๋ฒคํธ๋ฅผ ์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ํฐ ์์์์์ ํด๋ฆญ์ ์กฐ๊ฑดํํ๋ ์ฌ๊ณ ๊ฐ ์ ์ ํ๊ฒ ๋๊ปด์ง๋๋ค ๐