๐Ÿ“–ํ”„๋ ˆ์ž„์›Œํฌ ์—†๋Š” ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์„ ์ฝ๊ณ  - 3์žฅ. DOM ์ด๋ฒคํŠธ ๊ด€๋ฆฌ

MJยท2023๋…„ 1์›” 4์ผ
0

์ฑ…์„ ์ฝ๊ณ 

๋ชฉ๋ก ๋ณด๊ธฐ
3/5
post-thumbnail

์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•ด ์šฐํ…Œ์ฝ”์—์„œ ์ถ”์ฒœ๋ฐ›์€ ์ฑ…์„ ์ฝ๊ณ 

โœ”๏ธ ์ด๋ฒคํŠธ?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ณ ์ •๋œ ๊ทธ๋ฆผ์ด ์•„๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด์šฉ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด๋Ÿฐ ๋ณ€๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ด๋ฒคํŠธ๋‹ค.

โœ”๏ธ YAGNI ์›์น™

YAGNI ์›์น™์ด๋ž€ You aren't gonna need it์˜ ์•ฝ์ž๋กœ ์ •๋ง ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ๋ผ๋ผ๋Š” ์›์น™์ด๋‹ค.

ํ•œ๋งˆ๋””๋กœ ๋ฏธ๋ž˜๋ฅผ ์˜ˆ์ธกํ•˜์ง€๋งˆ๋ผ๋ผ๋Š” ์ด์•ผ๊ธฐ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ, ๋จผ์ € ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ฐœ๋ฐœํ•˜๊ณ  ์ƒˆ๋กœ์šด ์š”๊ตฌ๊ฐ€ ์ƒ๊ธธ๋ฉด ์ด์— ๋”ฐ๋ผ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „์‹œ์ผœ ๊ฐ€์•ผํ•œ๋‹ค.

๋‹น์‹ ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์˜ˆ์ธกํ•  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ ๊ตฌํ˜„ํ•˜๋ผ.
-์ œํ”„๋ฆฌ์Šค(xp์˜ ์ฐฝ์‹œ์ž)

ํŠนํžˆ ํ”„๋ ˆ์ž„์›Œํฌ ์—†๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด ์›์น™์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ฒจ์ง„๋‹ค.
์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์—”์ง€๋‹ˆ์–ด๋งํ•  ๊ฒฝ์šฐ ์•„๋ฌด๋„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ํ™•์žฅ ์„ค๊ณ„์— ๊ณผ๋„ํ•œ ์œ„ํ—˜์ด ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœ”๏ธ DOM ์ด๋ฒคํŠธ API

์ด๋ฒคํŠธ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋™์ž‘์œผ๋กœ, ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๋ฅผ ์•Œ๋ ค์ค˜ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ, ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ, ๋ทฐ ์ด๋ฒคํŠธ๋ฅผ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํŠธ๋ฆฌ๊ฑฐํ•œ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ์Šคํ…œ ์ž์ฒด์—์„œ๋„ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ํด๋ฆญ ์ด๋ฒคํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด๋‹ค.

๋ฒ„ํŠผ ๋ Œ๋”๋ง ๐Ÿ”œ ๋ฒ„ํŠผ ํด๋ฆญ ๐Ÿ”œ click ์ด๋ฒคํŠธ ์ „๋‹ฌ ๐Ÿ”œ click ์ด๋ฒคํŠธ ์บก์ฒ˜ ๐Ÿ”œ click ์ด๋ฒคํŠธ์— ๋ฐ˜์‘

โ— ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๋ ค๋ฉด ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ DOM์š”์†Œ(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ถˆ๋ฆฌ๋Š” ์ฝœ๋ฐฑ)์— ์—ฐ๊ฒฐํ•ด์•ผํ•œ๋‹ค.
โ— ๋ทฐ๋‚˜ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ์˜ ๊ฒฝ์šฐ window ๊ฐ์ฒด์— ์ด๋ฒคํŠธ ํ•ธ๋“œ๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

์†์„ฑ์— ํ•ธ๋“ค๋Ÿฌ ์—ฐ๊ฒฐ

on์†์„ฑ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ DOM์š”์†Œ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋น ๋ฅด์ง€๋งŒ ์ง€์ €๋ถ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ on์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
๋ชจ๋“  ์ด๋ฒคํŠธ ํƒ€์ž…๋งˆ๋‹ค DOM์š”์†Œ์— ํ•ด๋‹น๋˜๋Š” ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

on์†์„ฑ์˜ ๋‹จ์ ์€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•ธ๋“ค๋Ÿฌ๋งŒ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ํ•ธ๋“œ๋Ÿฌ๋ฅผ ๋ฎ์–ด ์“ฐ๋ฉด ์›๋ž˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ์˜์›ํžˆ ์†Œ์‹ค๋œ๋‹ค.

addEventListener๋กœ ํ•ธ๋“ค๋Ÿฌ ์—ฐ๊ฒฐ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ธ addEventListener ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.
์ด ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  DOM๋…ธ๋“œ์— EventTarget ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค์˜ add~๋ฉ”์„œ๋“œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“œ๋Ÿฌ๋ฅผ DOM ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

removeEventListener๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์‚ญ์ œ

DOM์— ์š”์†Œ๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋‹ฌ๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ์—๋Š” Event ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ํƒ€์ž…์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” Event ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ Event ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ๋กœ click์ด๋ฒคํŠธ๋Š” MouseEvent ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
์ด ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ด๋ฒคํŠธ ์ค‘ ํฌ์ธํ„ฐ์˜ ์ขŒํ‘œ, ์ด๋™.. ์— ๋Œ€ํ•œ ์ •๋ณด๋“ฑ์ด ์žˆ๋‹ค.
- MouseEvnet์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต ๊ตฌ์กฐ

DOM ์ด๋ฒคํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด

์—ฌ๊ธฐ ์ค‘์ฒฉ๋œ HTML ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค.

<body>
  <div>
    <button/>
  </div>
<body>
document
  .querySelector('div')
  .addEventListener('click', () => { // click์€ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ด๋ฒคํŠธ์˜ ํƒ€์ž…
    console.log('Div Click') // {}์•ˆ์— ์ฝ”๋“œ๋Š” ๋‘๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
  }, false) // false๋Š” ์„ธ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ useCapture์ด๋‹ค.

document
  .querySelector('button')
  .addEventListener('click', () => {
  	console.log('Button Click')
  }, false)

์ด ๊ตฌ์กฐ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ button์ด div์•ˆ์— ์žˆ์œผ๋ฏ€๋กœ button๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋‘ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ชจ๋‘ ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ DOM ๋…ธํŠธ์—์„œ ์‹œ์ž‘ํ•ด ๋ชจ๋“  ์กฐ์ƒ ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.

์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฒ„๋ธ”๋‹จ๊ณ„ or ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด๋ผ ๋ถˆ๋ฆฐ๋‹ค.
์ด ๋‹จ๊ณ„๋Š” ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ƒํ–ฅ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Event ์ธํ„ฐํŽ˜์ด์Šค์˜ stopPropagation๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฒ„๋ธ” ์ฒด์ธ์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

addEventListener๋ฉ”์„œ๋“œ์— ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” useCapture๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์ด false์ธ ๊ฐ’์ด ์žˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ํญ๋„“์€ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์„ ๊ฐ–๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌํ•จ์‹œ์ผœ์•ผํ•œ๋‹ค.

์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— true๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฒ„๋ธ”๋‹จ๊ณ„ ๋Œ€์‹  ์บก์ฒ˜ ๋‹จ๊ณ„์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
์บก์ฒ˜ ๋‹จ๊ณ„๋Š” ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฒ„๋ธ”๋‹จ๊ณ„์— ๋ฐ˜๋Œ€์ธ ํ•˜ํ–ฅ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.


์‹œ์Šคํ…œ์€ ์บก์ฒ˜๋‹จ๊ณ„์™€๐Ÿ”œ ๋ชฉํ‘œ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ๐Ÿ”œ ๋ฒ„๋ธ”๋‹จ๊ณ„๋กœ ์‹คํ–‰๋œ๋‹ค.

  • ์บก์ฒ˜๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ html์—์„œ ๋ชฉํ‘œ ์š”์†Œ๋กœ ์ด๋™ํ•œ๋‹ค.
  • ๋ชฉํ‘œ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ๋ชฉํ‘œ ์š”์†Œ์— ๋„๋‹ฌํ•œ๋‹ค.
  • ๋ฒ„๋ธ”๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ๋ชฉํ‘œ ์š”์†Œ์—์„œ html๋กœ ์ด๋™ํ•œ๋‹ค.

๊ธฐ๋ณธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜

์ƒˆ๋กœ์šด ์ƒํƒœ๋งˆ๋‹ค ์ƒˆ๋กœ์šด DOMํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด ๊ฐ€์ƒ DOM์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.๋ชจ๋“  ์ด๋ฒคํŠธ ๋‹ค์Œ์— ์ƒํƒœ๋ฅผ ์กฐ์ž‘ํ•œ ํ›„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๋ฉ”์ธ ๋ Œ๋”๋ง ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ดˆ๊ธฐ์ƒํƒœ ๐Ÿ”œ ๋žœ๋”๋ง ๐Ÿ”œ ์ด๋ฒคํŠธ ๐Ÿ”œ ์ƒˆ๋กœ์šด ์ƒํƒœ ๐Ÿ”œ ๋žœ๋”๋ง ๐Ÿ”œ ์ด๋ฒคํŠธ ๐Ÿ”œ ์ƒˆ๋กœ์šด์ƒํƒœ ๐Ÿ”œ ๋žœ๋”๋ง ๐Ÿ”œ ...

์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€์ •ํ•œ๋‹ค.

  • ์ดˆ๊ธฐ์ƒํƒœ: ๋น„์–ด์žˆ๋Š” ์š”์†Œ
  • ๋ Œ๋”๋ง: ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น„์–ด์žˆ๋Š” ์š”์†Œ ํ‘œ์‹œ
  • ์ด๋ฒคํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ '๋”๋ฏธ'๋ผ๋Š” ์ƒˆ ํ•ญ๋ชฉ ์ƒ์„ฑ
  • ์ƒˆ๋กœ์šด ์ƒํƒœ: ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ๊ฐ€์ง„ ์š”์†Œ
  • ๋ Œ๋”๋ง: ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ๊ฐ€์ง„ ์š”์†Œ ํ‘œ์‹œ
  • ์ด๋ฒคํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ๋ชฉ ์‚ญ์ œ
  • ์ƒˆ๋กœ์šด ์ƒํƒœ: ๋น„์–ด์žˆ๋Š” ์š”์†Œ
  • ๋ Œ๋”๋ง: ๋น„์–ด์žˆ๋Š” ์š”์†Œ ํ‘œ์‹œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ„๋‹จํ•œ ์œ ์Šค์ผ€์ด์Šค์˜ ๋‹จ๊ณ„๋ฅผ ์—ด๊ฑฐํ•จ์œผ๋กœ์จ ์ƒํƒœ-๋ Œ๋”๋ง-์ด๋ฒคํŠธ ๋ฃจํ”„์—๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

profile
A fancy web like a rose

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