๐Ÿ’ซ JavaScript ์ด๋ฒคํŠธ

์ •์€๊ฒฝยท2020๋…„ 2์›” 15์ผ
0

๐Ÿ‘ธ Front-End Queen

๋ชฉ๋ก ๋ณด๊ธฐ
9/265

Bubbling/Capturing

  • bubbling : ์ด๋ฒคํŠธ ์‹คํ–‰๋œ ํƒœ๊ทธ์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ƒ์œ„๋กœ ์ด๋ฒคํŠธ ์ „ํŒŒ
  • caturing : ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋œ ํƒœ๊ทธ์˜ ์œ„์œ„์œ„์œ„์œ„์˜ ์Šˆํผ์กฐ์ƒํƒœ๊ทธ์ธ DOM์—์„œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋œ ํƒœ๊ทธ๊นŒ์ง€ ์ด๋ฒคํŠธ ์ง„ํ–‰

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

  • ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” DOM ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ DOM ์ด๋ฒคํŠธ ํ๋ฆ„์— ์˜ํ•˜์—ฌ ์ „ํŒŒ๋œ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด, DOM ์ด๋ฒคํŠธ ํ๋ฆ„(์ด๋ฒคํŠธ ์ „ํŒŒ ๊ฒฝ๋กœ)์€?

์ด๋ฒคํŠธ ์ „ํŒŒ ๊ฒฝ๋กœ

  • ํ˜„์žฌ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ์ด๋ฒคํŠธ ๋Œ€์ƒ๋“ค์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก
  • ํ˜„์žฌ ๋ฌธ์„œ์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ ๊ตฌ์กฐ์ ์ธ ๊ฒฝ๋กœ๋กœ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋จ
  • ์ „ํŒŒ ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰์€ ์ด๋ฒคํŠธ ๋Œ€์ƒ์ด๋ฉฐ, ๋ชฉ๋ก์˜ ์•ž์„  ๋Œ€์ƒ๋“ค์€ ํ˜„์žฌ ๋Œ€์ƒ์˜ ๋ถ€๋ชจ ์š”์†Œ๋“ค
    • ์˜ˆ: "๋”, ๋ถ€๋ชจํƒœ๊ทธ1, ๋ถ€๋ชจํƒœ๊ทธ2, .... , ์ด๋ฒคํŠธ ๋Œ€์ƒ ํƒœ๊ทธ"
  • ์ „ํŒŒ ๊ฒฝ๋กœ๊ฐ€ ํ•œ ๋ฒˆ ์ •์˜๋œ๋‹ค๋ฉด, ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ๊ฐ ์ „ํŒŒ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ ์ „ํŒŒ๋œ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด, ์ „ํŒŒ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡?

์ „ํŒŒ๋‹จ๊ณ„

์ด์ „ ๋‹จ๊ณ„์—์„œ stopPropagation()๋“ฑ์ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์ดํ›„์˜ ์ด๋ฒคํŠธ ๋‹จ๊ณ„๋ฅผ ์ƒ๋žต๋œ๋‹ค.
1) ์บก์ณ๋ง ๋‹จ๊ณ„ : window ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋Œ€์ƒ์˜ ๋ถ€๋ชจ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋˜๋Š” ๋‹จ๊ณ„
2) ์ด๋ฒคํŠธ ๋Œ€์ƒ ๋‹จ๊ณ„: ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ์ด๋ฒคํŠธ ๋Œ€์ƒ์— ๋„๋‹ฌํ•˜๋Š” ๋‹จ๊ณ„, ์ด ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ช…์‹œํ•˜๋ฉด, ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ƒ๋žต
3) ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„: ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ๋Œ€์ƒ์˜ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ window ๊ฐ์ฒด๊นŒ์ง€ ์—ญ์ˆœ์œผ๋กœ ์ „ํŒŒ

์ผ๋‹จ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋‚˜๋ฉด

  • ์ผ๋‹จ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋‚˜๋ฉด, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ DOM์ด ์ˆ˜์ •๋˜๋”๋ผ๋„ ์ด๋ฒคํŠธ ์ „๋‹ฌ์€ ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ , "์›๋ž˜์˜ ๊ฒฝ๋กœ"๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋œ๋‹ค.

์ด๋ฒคํŠธ ๋ฐœ์ƒ ๊ณผ์ • ์ •๋ฆฌ

1) ํŠน์ • DOM์—์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
2) ํ•ด๋‹น DOM์˜ dispatchEvent()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฒคํŠธ ์ „๋‹ฌ
3) ์ด๋ฒคํŠธ ์ „๋‹ฌ์€ propagation path(์ „ํŒŒ๊ฒฝ๋กœ)์— ๋”ฐ๋ผ์„œ ์ˆ˜ํ–‰๋จ
4) ์ „๋‹ฌ๋‹จ๊ณ„(1) ์ง„ํ–‰: ์ด๋ฒคํŠธ ์บก์ณ๋ง
5) ์ „๋‹ฌ๋‹จ๊ณ„(2) ์ง„ํ–‰: ์ด๋ฒคํŠธ ๋Œ€์ƒ์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ˜ธ์ถœ
6) ์ „๋‹ฌ๋‹จ๊ณ„(3) ์ง„ํ–‰: ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง

  • ๋””ํดํŠธ๋Š” ๋ฒ„๋ธ”๋ง

์‹ค์Šต์ฝ”๋“œ

https://codesandbox.io/s/jek-event-bubbling-and-capturing-ff4br?file=/index.html&resolutionWidth=320&resolutionHeight=675

Reference

  • ์ฑ…/์†๊นŠ์€ JavaScript/์–‘์„ฑ์ต์ง€์Œ/๋ฃจ๋น„ํŽ˜์ดํผ, 5.2.1 ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ณ๋ง

1. ์ด๋ฒคํŠธ ๋“ฑ๋ก (addEventListener)

"adddEventListener('์ด๋ฒคํŠธํƒ€์ž…', ํ•จ์ˆ˜๋ช…, false)"์—์„œ false๋Š” ๋ฌด์—‡์ธ๊ฐ€?**

์ด๋ฒคํŠธ ํ•จ์ˆ˜์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. (์ถœ์ฒ˜:MDN)

"adddEventListener('์ด๋ฒคํŠธํƒ€์ž…', ํ•จ์ˆ˜๋ช…, false)" ์ด๋ ‡๊ฒŒ ์“ฐ๋Š”๋ฐ!
๋งˆ์ง€๋ง‰ false์˜ ์ •์ฒด๋Š” ๋ฌด์—‡์ผ๊นŒ?

MDN์—์„œ addEventListener์˜ ๋ฌธ๋ฒ•์„ ์‚ดํŽด๋ณด๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.........

"false"์˜ ์ •์ฒด๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ์ฐพ์€ ์ฒซ๋ฒˆ์งธ ์ž๋ฃŒ!

"์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์‚ฌ์šฉ ์˜ˆ์ œ"
clickNode.addEventListener('click', handleClick, false); ์†Œ์Šค์—์„œ ์„ธ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ false ์ด๋ฉด ๋ฒ„๋ธ”๋ง์„ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  true์ด๋ฉด ์บก์ณ๋ง์„ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ „ํŒŒ(propagation)์— ๋Œ€ํ•ด ๋ฒ„๋ธ”๋ง ๋ง‰๊ธฐ๋Š” event.stopPropagation() ํ˜ธ์ถœํ•œ๋‹ค. ํƒœ๊ทธ์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด ์˜ˆ๋กœ ํƒœ๊ทธ์˜ ํ™”๋ฉด ์ด๋™์„ ๋ง‰๊ธฐ์œ„ํ•ด event.preventDefault() ํ˜ธ์ถœํ•œ๋‹ค.

(์ถœ์ฒ˜:
https://mobicon.tistory.com/474)

๋ฒ„๋ธ”๋ง๊ณผ ์บก์ณ๋ง์„ ํ‚ค์›Œ๋“œ๋กœ ์ฐพ์€ 2๋ฒˆ์งธ ์ž๋ฃŒ!

๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ด๋–ป๊ฒŒ ํŠน์ • ํ™”๋ฉด ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ํ™”๋ฉด ์š”์†Œ์— ์ „ํŒŒํ•˜๋Š”์ง€ ๊ฐ™์ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
(์ถœ์ฒ˜: https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/)

2๋ฒˆ์งธ ์ž๋ฃŒ๋ฅผ ํ†ตํ•ด์„œ
์•Œ๊ฒŒ๋œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ๋‹ค.

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง vs. ์ด๋ฒคํŠธ ์บก์ณ**

  • ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„์˜ ํ™”๋ฉด์š”์†Œ๋กœ ์ „๋‹ฌ๋˜๋Š” ํŠน์„ฑ
    • ์˜ˆ) "adddEventListener('์ด๋ฒคํŠธํƒ€์ž…', ํ•จ์ˆ˜๋ช…, false)"
    • "false"๋ผ๊ณ  ํ•˜์ง€ ํ‘œ์‹œ ์•ˆํ•˜๋ฉด ๋””ํดํŠธ๊ฐ€ false์ž„
  • ์ด๋ฒคํŠธ ์บก์ณ: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„์˜ ํ™”๋ฉด์š”์†Œ๋กœ ์ „๋‹ฌ๋˜๋Š” ํŠน์„ฑ
    • ์˜ˆ) "adddEventListener('์ด๋ฒคํŠธํƒ€์ž…', ํ•จ์ˆ˜๋ช…, true)"

2. ์ด๋ฒคํŠธ ์ „๋‹ฌ๋ฐฉ์‹: ๋ฒ„๋ธ”๋ง/์บก์ณ/Stop Propagation/์œ„์ž„

๋ฆฌ์•กํŠธ๋Š” ์•„๋ž˜์˜ 3๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์ผ๊นŒ? ์ด๋ฒคํŠธ ์œ„์ž„์ผ๊นŒ?

2-1. Event Bubbling

ํŠน์ • ํ™”๋ฉด ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋” ์ƒ์œ„์˜ ํ™”๋ฉด ์š”์†Œ๋“ค๋กœ ์ „๋‹ฌ๋˜์–ด ๊ฐ€๋Š” ํŠน์„ฑ

2-2. Event Capture

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์‹

2-3. Event Stop Propagation

๊ทธ๋ƒฅ ์›ํ•˜๋Š” ํ™”๋ฉด ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋งŒ ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ๋‹ค
ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ

2-4. Event Delegation (์ด๋ฒคํŠธ ์œ„์ž„)

ํ•˜์œ„ ์š”์†Œ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ณ  ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„ ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹

Reference

profile
#์˜์‹์˜ํ๋ฆ„ #์ˆœ๊ฐ„์ˆœ๊ฐ„ #์ƒ๊ฐ์˜์Šค๋ƒ…์ƒท

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