[JavaScript] ์ด๋ฒคํŠธ ์ „ํŒŒ bubbling, capturing
728x90

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

์šฐ๋ฆฌ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™์ ์ธ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ,
ํ”ํžˆ๋“ค addEventListener()๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณค ํ•œ๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ ๊ฐ์ฒด event object๋ฅผ ๋งŒ๋“ ๋‹ค.

ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ๊ฐ์ฒด ๋‚ด๋ถ€. (๊ธธ์–ด์„œ ์ผ๋ถ€๋งŒ ์บก์ณ)

๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฒคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ์ง€ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ?

์ด๋Ÿฐ ๊ถ๊ธˆ์ฆ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ ํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค.

๋ฐ”๋กœ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์ด๋ฒคํŠธ ์บก์ณ๋ง, ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด๋‹ค.

 

 

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

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ๋น„๋ˆ„๋ฐฉ์šธ์ด ์•„๋ž˜์—์„œ ์˜ฌ๋ผ์˜ค๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์ข€ ๋” ์ˆ˜์›”ํ•œ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

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

Article๋ถ€ํ„ฐ Button๊นŒ์ง€ ์ค‘์ฒฉ๋˜์–ด์žˆ๋Š” ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ๊ฐ ์š”์†Œ๋ณ„๋กœ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์ž.

 

๋‹จ์ง€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋ฟ์ธ๋ฐ ๊ฐ€์žฅ ์ƒ์œ„ ์š”์†Œ์ธ article๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ชจ๋‘ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ํŠน์ • ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ตœ์ƒ์œ„์˜ ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ์ „ํŒŒ์‹œํ‚ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

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

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ stopProagation() ์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋กœ ์ค‘์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

division.addEventListener('click', () => {
  event.stopPropagation(); // ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ์ค‘์ง€์‹œํ‚ด
  console.log('division');
});

 

 

 

์ด๋ฒคํŠธ ์บก์ณ๋ง Event Capturing

์ด๋ฒคํŠธ ์บก์ณ๋ง์€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€๋กœ ์ƒ์œ„์—์„œ ํ•˜์œ„์š”์†Œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ตœ์ƒ์œ„ ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ•˜์œ„ ์š”์†Œ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

์•„๊นŒ์™€ ๋ฐ˜๋Œ€๋กœ article ๋ถ€ํ„ฐ ๋กœ๊ทธ๊ฐ€ ์ฐํžŒ๋‹ค.

๋˜‘๊ฐ™์ด button์„ ๋ˆŒ๋ €์Œ์—๋„ article๋ถ€ํ„ฐ button์œผ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์ด๋ฒคํŠธ ์บก์ณ๋ง์€ addEventListener() ๋ฉ”์„œ๋“œ์—์„œ useCapture ๋ผ๋Š” ์˜ต์…˜์„ ์„ค์ •ํ•˜์—ฌ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ false์ธ๋ฐ, true๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์š”์†Œ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋จผ์ € ๋ฐœ๋™๋œ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด true๋กœ๋งŒ ์ž‘์„ฑํ•ด์ค„ ์ˆ˜๋„ ์žˆ๊ณ ,

article.addEventListener(
  'click',
  () => {
    console.log('article');
  },
  true
);

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์˜ต์…˜์„ ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. {capture: true}๋ฅผ ์ถ•์•ฝํ•œ ๊ฒƒ์ด ์œ„์˜ true๋‹ค.

container.addEventListener(
  'click',
  (event) => {
    event.target.style.background = 'blue';
  },
  {
    capture: true
  }
);

 

์ด๋Ÿฐ ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์œ„์ž„ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ๐Ÿ˜‡

 

 

์ถ”๊ฐ€๋กœ ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์‹์„ ์žฌ๋ฐŒ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์•Œ๊ฒŒ๋˜์–ด ์†Œ๊ฐœํ•œ๋‹ค.

https://domevents.dev/

 

Explore DOM Events

A visualizer to help you learn how the DOM Event system works through exploration

domevents.dev

 

728x90