๐Ÿคฟ (8) DOM - ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ณ๋ง

Kayยท2023๋…„ 3์›” 21์ผ
0

Javascript

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

์ถœ์ฒ˜
Javscript Info - ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ฒ˜๋ง

1. ์บก์ณ๋ง

์ถœ์ฒ˜์—์„œ ์บก์ณํ•œ ์‚ฌ์ง„์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, DOM ์ด๋ฒคํŠธ์—์„œ ์ •์˜ํ•œ ์ด๋ฒคํŠธ ํ˜ธ์ถœ์€
์บก์ณ๋ง ๋‹จ๊ณ„ -> ํƒ€๊นƒ ๋‹จ๊ณ„ -> ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.

์ตœ์ƒ๋‹จ ์š”์†Œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๊ณ 
-> ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ํƒ€๊นƒ์„ ๋ฐœ๊ฒฌํ•˜๊ณ 
-> ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ํƒ€๊นƒ๋ถ€ํ„ฐ ์ตœ์ƒ๋‹จ ์š”์†Œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋œ๋‹ค.

์บก์ณ๋ง์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋Š”

<script>
	a.addEventListener('click', () => {
    	// ...	
    }, { capture: true })
</script>

์ฒ˜๋Ÿผ addEventListener ํ•จ์ˆ˜์˜ ์„ธ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ true ๋˜๋Š” { capture: true }๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์บก์ณ๋ง์€ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๋ธ”๋ง์„ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค.

2. ๋ฒ„๋ธ”๋ง

๋ฒ„๋ธ”๋ง์ด๋ž€

์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•  ๊ฒฝ์šฐ, ๋ถ€๋ชจ์™€ ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ ... ์ตœ์ƒ๋‹จ ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

<div onclick="alert('div area')">
	<p onclick="alert('p area')">click here!</p>
</div>

"click here!"์— ํ•ด๋‹นํ•˜๋Š” ํ…์Šค๋ฅผ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ <p> ํƒœ๊ทธ์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์ด์–ด ๋ถ€๋ชจ ์š”์†Œ์ธ <div> ํƒœ๊ทธ์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค.

๋ฒ„๋ธ”๋ง์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ

์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ์ƒํ’ˆ ์˜์—ญ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

<div id="product">
  <div>
     <img src="./assets/icons/icon-folder.png" alt="" style="width: 50px;height: 50px;">
  </div>
  <div>
     <p>์ œ๋ชฉ: ๋‚˜๋Š” ์˜ค๋ž˜ ์‚ด ์ˆ˜ ์žˆ๋Š” ์–‘์ด ํ•„์š”ํ•ด.</p>
     <p>๋‚ด์šฉ: ์ด๊ฑด ์ƒ์ž์•ผ. ๋„ค๊ฐ€ ๊ฐ–๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์–‘์€ ๊ทธ ์•ˆ์— ๋“ค์–ด ์žˆ์–ด.</p>
  </div>
</div>

<script>
  const productArea = document.querySelector("#product");
  productArea.addEventListener('click', (e) => {
     console.log(e.target);
     alert('ํ’ˆ์ ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
  })
</script>

e.target์€ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
์ฝ˜์†” ์ฐฝ์„ ๋ณด๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋œ id๊ฐ€ product์ธ <div> ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์˜๋„ํ•œ๋Œ€๋กœ id๊ฐ€ product์ธ <div> ์š”์†Œ์— ๋“ฑ๋ก๋œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋™์ž‘ํ–ˆ๋‹ค.

๋งŒ์•ฝ ๋ฒ„๋ธ”๋ง์ด ์—†๋‹ค๋ฉด id๊ฐ€ product์ธ <div> ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ ๋ชจ๋‘์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

๋ฒ„๋ธ”๋ง ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

<script>
  a.addEventListener('click', (e) => {
	// ์ „ํŒŒ(Propagation)๋ฅผ ๋ง‰๋Š” ๊ฒƒ, ์ฆ‰ ๋ฒ„๋ธ”๋ง ๋ง‰๊ธฐ
    // ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋™์ž‘์„ ๋ง‰์ง€๋Š” ๋ชปํ•จ
    e.stopPropagation();
    // ๋ฒ„๋ธ”๋ง๊ณผ ๋‹ค๋ฅธ ์š”์†Œ์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ์˜ ๋™์ž‘๊นŒ์ง€ ๋ง‰๊ธฐ
	e.stopImmediatePropagation();
  })
</script>

์œ„ ์˜ˆ์‹œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ๋Š” ๋ฒ„๋ธ”๋ง์ด ๋™์ž‘ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

<script>
  const productArea = document.querySelector("#product");
  productArea.addEventListener('click', (e) => {
     console.log(e.target);
     alert('ํ’ˆ์ ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
  })
  
  const imgArea = document.querySelector("#product > div> img");
  imgArea.addEventListener('click', (e) => {
     e.stopPropagation();
     // e.stopImmediatePropagation();
     alert('์ด๋ฏธ์ง€ ๋ชจ๋‹ฌ ๋œจ๋„๋ก ํ•˜๊ณ  ์‹ถ์–ด์š”.');
  })
</script>

e.stopPropagation();๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ๋Š” img์— ๋“ฑ๋ก๋œ ํด๋ฆญ ์ด๋ฒคํŠธ๋งŒ ๋™์ž‘
  • ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” img์— ๋“ฑ๋ก๋œ ํด๋ฆญ ์ด๋ฒคํŠธ ๋™์ž‘ ํ›„ productArea์— ๋“ฑ๋ก๋œ ํด๋ฆญ ์ด๋ฒคํŠธ๋„ ๋™์ž‘

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