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

๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํŠธ ์บก์ณ๋ง, ๋ฒ„๋ธ”๋ง์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Apr 27, 2021

๊น€ํ˜„๊ธฐ

#WEB

UX TECH TF ์—…๋ฌด์—์„œ DOM๊ณผ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ผ์ด ๋งŽ์€๋ฐ์š”, ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง ๊ณต๋ถ€ํ•œ ํ›„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„๋ธ”๋ง

Element1 ์š”์†Œ์•ˆ์— Element2๊ฐ€ ์žˆ๊ณ  ๋‘ ์š”์†Œ์—๋Š” ๋ชจ๋‘ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ Element2๋ฅผ ํด๋ฆญํ•˜๋ฉด Element1, Element2 ๋‘๊ตฐ๋ฐ ๋ชจ๋‘์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋จผ์ € ์‹คํ–‰ ๋ ๊นŒ์š”?


Element1
Element2

jsfiddle์—์„œ ํ™•์ธ ํ•ด์ฃผ์„ธ์š”!

์ด๋ฒคํŠธ ์ „๋‹ฌ ๋ฐ ํ๋ฆ„

ํ‘œ์ค€ DOM ์ด๋ฒคํŠธ์—์„œ ์ •์˜ํ•œ ์ด๋ฒคํŠธ ํ๋ฆ„์—๋Š” 3๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์บก์ณ๋ง ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„
  • ํƒ€๊นƒ ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ์‹ค์ œ ํƒ€๊ฒŸ ์š”์†Œ์— ์ „๋‹ฌ๋˜๋Š” ๋‹จ๊ณ„
  • ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„

์•„๋ž˜ ๊ทธ๋ฆผ์€ DOMํŠธ๋ฆฌ์—์„œ ์ด๋ฒคํŠธ์˜ ํ๋ฆ„์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.



eventflow
์ถœ์ฒ˜: https://www.w3.org/TR/uievents/#event-flow

์ง์ ‘ ๊ทธ๋ ค๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๊ธฐ

์œ„ ๊ทธ๋ฆผ๊ณผ ๋‹จ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  1. element2๋ฅผ ํด๋ฆญ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งจ ์ƒ๋‹จ์˜ ์กฐ์ƒ์ธ window์—์„œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜์–ด element2๊นŒ์ง€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.(์บก์ณ๋ง ๋‹จ๊ณ„)
  3. element2์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.(ํƒ€๊นƒ ๋‹จ๊ณ„)
  4. ๋‹ค์‹œ window๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.(๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„)
  5. element1์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  6. ์ด๋ฒคํŠธ ํ๋ฆ„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
draw

์บก์ณ๋ง

๋™์ผํ•˜๊ฒŒ element2๋ฅผ ํด๋ฆญํ•˜๋ฉด element1์ด ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  element2๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

์ด๋•Œ ์บก์ณ๋ง์„ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

addEventListener์˜ options ์ด์šฉํ•ด์„œ ์บก์ฒ˜๋ง์„ ํ™œ์„ฑํ™” ์‹œ์ผœ์ฃผ๋ฉด ๋˜๋Š”๋ฐ์š” ๊ธฐ๋ณธ์ ์œผ๋กœ addEventListener์—์„œ ๊ธฐ๋ณธ๊ฐ’์€ false(๋ฒ„๋ธ”๋ง)์ž…๋‹ˆ๋‹ค.

target.addEventListener(type, listener, options);

ele1.addEventListener('click', () => {}, { capture: true });

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”?

draw
  1. element2๋ฅผ ํด๋ฆญ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งจ ์ƒ๋‹จ์˜ ์กฐ์ƒ์ธ window์—์„œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜์–ด element2๊นŒ์ง€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.(์บก์ณ๋ง ๋‹จ๊ณ„)
  3. ์บก์ณ๋ง ๋‹จ๊ณ„์—์„œ ๋ฐœ๊ฒฌ๋œ element1์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. element2์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.(ํƒ€๊นƒ ๋‹จ๊ณ„)
  5. ๋‹ค์‹œ window๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.(๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„)
  6. ์ด๋ฒคํŠธ ํ๋ฆ„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

jsfiddle์—์„œ ํ™•์ธ ํ•ด์ฃผ์„ธ์š”!

๋ฌธ์ œ

์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋ก ํ•ด๋†“์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

ele2.addEventListener('click', () => alert('๋ฒ„๋ธ”:Element2'));
ele1.addEventListener('click', () => alert('๋ฒ„๋ธ”:Element1'));
ele1.addEventListener('click', () => alert('์บก์ณ:Element1'), { capture: true });
  1. element2๋ฅผ ํด๋ฆญ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งจ ์ƒ๋‹จ์˜ ์กฐ์ƒ์ธ window์—์„œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜์–ด element2๊นŒ์ง€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.(์บก์ณ๋ง ๋‹จ๊ณ„)
  3. ์บก์ณ๋ง ๋‹จ๊ณ„์—์„œ ๋ฐœ๊ฒฌ๋œ element1์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. element2์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.(ํƒ€๊นƒ ๋‹จ๊ณ„)
  5. ๋‹ค์‹œ window๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.(๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„)
  6. ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ๋ฐœ๊ฒฌ๋œ element1์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  7. ์ด๋ฒคํŠธ ํ๋ฆ„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์บก์ณ:Element1 -> ๋ฒ„๋ธ”: Element2 -> ๋ฒ„๋ธ”: Element1์˜ ์ˆœ์„œ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

jsfiddle์—์„œ ํ™•์ธ ํ•ด์ฃผ์„ธ์š”!

๋ฒ„๋ธ”๋ง๊ณผ ์บก์ณ๋ง์˜ ์—ญ์‚ฌ

๊ณผ๊ฑฐ ๋„ท์Šค์ผ€์ดํ”„ vs MS์˜ ๋ธŒ๋ผ์šฐ์ € ์ „์Ÿ์ด ์žˆ์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์—์„œ

๋„ท์Šค์ผ€์ดํ”„๋Š” element1์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋จผ์ € ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.(์บก์ฒ˜๋ง)

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๋Š” element2 ์ด๋ฒคํŠธ๊ฐ€ ์šฐ์„ ํ•œ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.(๋ฒ„๋ธ”๋ง)

W3C์—์„œ๋Š” ํ˜„๋ช…ํ•˜๊ฒŒ ๋‘๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„์„ ์„ ํƒํ•˜์˜€๊ณ  ํ˜„์žฌ์˜ ์ด๋ฒคํŠธ ์ „๋‹ฌ๊ณผ ํ๋ฆ„์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

can i use์—์„œ capturing์„ ๊ฒ€์ƒ‰ ํ•ด๋ณด๋ฉด IE 6-8์€ ์บก์ณ๋ง ์ง€์›์ด ์•ˆ๋œ๋‹ค๊ณ  ํ™•์ธ์ด ๋˜๋„ค์š”!

can i use

๋งˆ์น˜๋ฉฐ

์ด๋ฒคํŠธ์˜ ์ „๋‹ฌ ๋‹จ๊ณ„์™€ ํ๋ฆ„์„ ์‚ดํŽด๋ณด๊ณ  ๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์šฉํ•ด๋ณด๋ฉด์„œ ์•Œ์•„๋ดค๋Š”๋ฐ์š”

์‹ค๋ฌด์˜ˆ์ œ ํ•˜๋‚˜์™€ ์ด๋ฒคํŠธ ์œ„์ž„์— ๋Œ€ํ•ด์„œ๋„ ์“ฐ๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ƒ๊ฐ๋ณด๋‹ค ๊ธ€์ด ๊ธธ์–ด์ ธ์„œ 2ํŽธ์—์„œ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋ฌธ์„œ

Grow & Glow ยฉ 2025

Banner images by undraw.co