์ฃผ์˜!โœจ
์ด ๊ธ€์€ ๊ฐœ๋ฐœ์„ ๋ฐฐ์›Œ๊ฐ€๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž ์ž‘์„ฑํ•˜๋Š” ์ผ์ข…์˜ ๊ณต๋ถ€๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.
ํ˜„์—…์—์„œ ์ผํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด๋‚˜ ์ •์„๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๐Ÿงผ Event Bubbling

JavaScript ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ด๋ฒคํŠธ ๋“ฑ์„ ์ž์ฃผ ์ด์šฉํ•˜๋‹ค ๋ณด๋‹ˆ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์œผ๋กœ ์ธํ•ด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์— ๋Œ€ํ•ด์„œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์ž.

๐Ÿ“ธ Event capture

์บก์ฒ˜๋ง์€ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งํ•ด์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐ”๊นฅ ์š”์†Œ๋ถ€ํ„ฐ ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๊นŒ์ง€ ์ฐพ์•„๋“ค์–ด๊ฐ€๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค. ์ฆ‰ ๋งŒ์•ฝ <Body> ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” <div> ์•ˆ์— ์žˆ๋Š” <span> ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ์ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ <html> => <body> => <div> => <span> ์˜ ์ˆœ์„œ๋กœ ์ฐพ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

๐Ÿง‹ Event Bubbling

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ๊ฑฐํ’ˆ์ด ์ƒ๊ธฐ๋ฉด์„œ ๋ฌผ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค. ๋งŒ์•ฝ 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()

์ด๋ฒคํŠธ๋“ค์ด ๋ฒ„๋ธ”๋ง ๋˜๋‹ค๋ณด๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์ผ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ด๋ฒคํŠธ ๊ฐ์ฒด์—๋Š” 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.preventDefault()

์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ด๋ณด์ž. event.preeventDefault() ๋Š” ์ด๋ฒคํŠธ์˜ ์ „ํŒŒ๊ฐ€ ์•„๋‹Œ ์ด๋ฒคํŠธ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๋‹ค๋งŒ, ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ์˜ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ฒดํฌ ๋ฐ•์Šค์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œ์‹œ์ผœ์„œ ์ฒดํฌ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ ๋‹ค๊ฑฐ๋‚˜ ์ธํ’‹์ฐฝ์— ์žˆ๋Š” ํ‚ค์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œ์‹œํ‚ค๊ณ  ํŠน์ • ์›ํ•˜๋Š” ์ธํ’‹๋งŒ ์ž…๋ ฅ๋˜๋„๋ก ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜์ด์ง€ ๋ฒ„๋ธ”๋ง์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?

โœ… e.target ! == e.currentTarget

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

profile
์‚ฌํšŒ์— ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ๊ฟˆ, ๋ฐ”๋กœ ์˜†์˜ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ํ‰์ƒ ๋ชฉํ‘œ์ธ ๊ฐœ๋ฐœ์ž.

4๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 8์›” 13์ผ

console.log ์˜ˆ์‹œ ๋•๋ถ„์— ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์ด ์™์™ ๋“ค์–ด์˜ค๋„ค์š”๐Ÿค“ target๋ผ๋ฆฌ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ๋ณด์•˜์Šต๋‹ˆ๋‹ค! ์ž‘์€ ์š”์†Œ๋ฅผ ์ฐพ์•„ ํด๋ฆญํ•  ๋•Œ์— ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํฐ ์š”์†Œ์—์„œ์˜ ํด๋ฆญ์„ ์กฐ๊ฑดํ™”ํ•˜๋Š” ์‚ฌ๊ณ ๊ฐ€ ์‹ ์„ ํ•˜๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค ๐Ÿ‘

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 8์›” 15์ผ

๋‚˜์ค‘์— ์ •๋ง ๋งŽ์ด ์จ๋จน์„ ๊ฒƒ ๊ฐ™์€ ์˜ˆ์‹œ๋„ค์š”! ๊ธฐ์–ตํ•˜๊ณ  ๋ฉ”๋ชจํ•ด๋†“๊ฒ ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ด์š” !!

1๊ฐœ์˜ ๋‹ต๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN