๐Ÿค”โ“ ์™œ ๊ตณ์ด ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ–ˆ์„๊นŒ? (e.target vs closest)

์ดํฌ์—ฐยท2025๋…„ 6์›” 10์ผ

๐Ÿงพ ๋ฒ„๋ธ”๋ง + ์ด๋ฒคํŠธ ์œ„์ž„ ๊ด€๋ จ ์ •๋ฆฌ

โ“ ์˜๋ฌธ์ด์˜€๋˜ ์ 

  • ์‡ผํ•‘๋ชฐ ์žฅ๋ฐ”๊ตฌ๋‹ˆ UI์—์„œ ์ „์ฒด .cart์— ํด๋ฆญ ์ด๋ฒคํŠธ ๊ฑธ์—ˆ์Œ.
  • ๊ฐ ์•„์ดํ…œ์˜ ์‚ญ์ œ ๋ฒ„ํŠผ์€ element.classList.contains('์‚ญ์ œ๋ฒ„ํŠผ')์œผ๋กœ ์ฒดํฌํ•ด์„œ ์‚ญ์ œ ๋™์ž‘ ์ฒ˜๋ฆฌ.
  • ๊ทธ๋Ÿฐ๋ฐ ์ˆ˜๋Ÿ‰ ์˜ฌ๋ฆฌ๋Š” ๋ฒ„ํŠผ์€ element.parentElement.classList.contains('increase-btn') ๋˜๋Š” ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ถ€๋ชจ๋ฅผ ์ฒดํฌํ•ด์„œ ์ฒ˜๋ฆฌํ•˜์‹ฌ.
  • ์งˆ๋ฌธ: e.target์œผ๋กœ ํด๋ฆญํ•œ ์š”์†Œ๋Š” ๋‹ค ์žกํžˆ๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€? ๊ทธ ์•ˆ์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ๋กœ ์ฒดํฌํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€?
    element.classList.contains('์ˆ˜๋Ÿ‰์ฆ๊ฐ€๋ฒ„ํŠผ')์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€..?
    โ†’ ์™œ ๊ตณ์ด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์“ฐ๋Š” ๊ฑด์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค..

โœ… ํ•ต์‹ฌ ๊ฐœ๋… ์ •๋ฆฌ

๐Ÿ” ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง

  • ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” ๊ฐ€์žฅ ์•ˆ์ชฝ ์š”์†Œ(์ž์‹) ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ฐ–์œผ๋กœ(๋ถ€๋ชจ) ํผ์ ธ๋‚˜๊ฐ.
  • e.target์€ ์‹ค์ œ ํด๋ฆญํ•œ ์š”์†Œ ๊ทธ ์ž์ฒด (๊ฐ€์žฅ ์•ˆ์ชฝ ์š”์†Œ)
  • e.currentTarget์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋‹จ ์š”์†Œ (์˜ˆ: .cart)

๐Ÿ’ก ๋ฌธ์ œ์˜ ์›์ธ

  • ์ˆ˜๋Ÿ‰ ๋ฒ„ํŠผ <button class="increase-btn"> ์•ˆ์— <img>๋‚˜ <i> ๊ฐ™์€ ์š”์†Œ๊ฐ€ ์žˆ์Œ.

  • ์‚ฌ์šฉ์ž๊ฐ€ <i>๋ฅผ ํด๋ฆญํ•˜๋ฉด:

    • e.target โ†’ <i>
    • <i>๋Š” "increase-btn" ํด๋ž˜์Šค๋ฅผ ์•ˆ ๊ฐ€์ง โ†’ classList.contains('increase-btn') โ†’ false

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: closest() - ์ด๊ฑด ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜๋ฐ๋กœ ๋ฐ˜์˜์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜!

  • e.target.closest('.increase-btn') ์‚ฌ์šฉํ•˜๋ฉด

    • ํด๋ฆญํ•œ ์š”์†Œ๋ถ€ํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ "increase-btn" ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์กฐ์ƒ ์ฐพ์Œ
    • ํด๋ฆญํ•œ ๊ณณ์ด <img>๋“  <button>์ด๋“  ์ „๋ถ€ ์ปค๋ฒ„ ๊ฐ€๋Šฅ
    • ๋ชป ์ฐพ์œผ๋ฉด null ๋ฐ˜ํ™˜ โ†’ ์กฐ๊ฑด ์ฒดํฌํ•˜๊ธฐ ์‰ฌ์›€

๐Ÿ’ป ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜๋Œ€๋กœ ํ•˜๋ ค๋ฉด contains๋Œ€์‹  closest ์‚ฌ์šฉ..!

document.querySelector('.cart').addEventListener('click', (e) => {
  const increaseButton = e.target.closest('.increase-btn');
  if (increaseButton) {
    console.log('์ˆ˜๋Ÿ‰ ์ฆ๊ฐ€!');
    // ์ˆ˜๋Ÿ‰ ๋Š˜๋ฆฌ๋Š” ์ฝ”๋“œ
  }

  const deleteButton = e.target.closest('.delete-btn');
  if (deleteButton) {
    console.log('์•„์ดํ…œ ์‚ญ์ œ!');
    // ์‚ญ์ œ ์ฝ”๋“œ
  }
});

โœ๏ธ ์ •๋ฆฌ

๊ฐœ๋…์„ค๋ช…
e.target์‹ค์ œ ํด๋ฆญ๋œ ์š”์†Œ (์˜ˆ: <i>)
e.currentTarget์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋‹จ ๋ถ€๋ชจ ์š”์†Œ (์˜ˆ: .cart)
.classList.contains()ํ•ด๋‹น ์š”์†Œ๊ฐ€ ํด๋ž˜์Šค ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
.closest('.ํด๋ž˜์Šค')ํด๋ฆญ๋œ ์š”์†Œ๋ถ€ํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ํด๋ž˜์Šค ๊ฐ€์ง„ ๋ถ€๋ชจ ์š”์†Œ ์ฐพ๊ธฐ
โœ… ์ด์œ ๋ฒ„ํŠผ ์•ˆ์˜ ์•„์ด์ฝ˜ ๋“ฑ ํด๋ฆญ ์‹œ๋„ํ•ด๋„, ์ •ํ™•ํžˆ ๋ฒ„ํŠผ์„ ๊ฐ์ง€ํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ
profile
์ฝ”๋ฆฐ์ด๐ŸŒฑ / ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๊ธฐ๋ก ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค, ์ œ๋กœ๋ฒ ์ด์Šค๋ถ€ํŠธ์บ ํ”„ ์ˆ˜๊ฐ•์ค‘...๐Ÿ˜„

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