๋ฒ„๋ธ”๋ง๊ณผ ์บก์ฒ˜๋ง

2025. 9. 23. 19:03ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

์ด๊ฑด ๋จธ๋ฉ”์ด๋“œ ๋‹ค๋ž‘์–ด์ธ๋ฐ, ์–˜ํ•œํ…Œ์„œ ๋‚˜์˜ค๋Š” 200g์˜ ํŠน์ˆ˜ ๋ถ€์œ„๊ฐ€ '๋ฒ„๋ธ”๋ฆฌ ๋ฑƒ์‚ด'์ด๋‹ค.

ํฌํšํ•œ ํ›„ ์ผ์ฃผ์ผ ๋’ค์— ๋ง›์ด ์ •์ ์— ๋‹ฌํ•˜์ง€๋งŒ ๋™์‹œ์— ์ผ์ฃผ์ผ์ด ์ง€๋‚˜๋ฉด ๋ฒ„๋ธ”์ด ๋˜์–ด ์‚ฌ๋ผ์ง„๋‹ค. (๊ทธ๋ž˜์„œ ๋จธ๋ฉ”์ด๋“œ ๋‹ค๋ž‘์–ด์ธ๊ฐ€..)

๊ตญ์ œ ๋ฒ•์•ˆ์„ ํ†ต๊ณผ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋‹ค๋ž‘์–ด ๋ฑƒ์‚ด ์ข‹์•„ํ•˜๋Š” ๋Œ€ํ†ต๋ น์—๊ฒŒ ๋‚ด๋†“์„ ์š”๋ฆฌ ์žฌ๋ฃŒ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

๊ทธ๋ƒฅ ๋ฒ„๋ธ”๋ง์„ ๋ณด๋‹ˆ๊นŒ ์ƒ๊ฐ๋‚ฌ๋‹ค. ์ •๋ง ๋ง›์žˆ๊ฒŒ ์ƒ๊ฒผ๋‹ค. ํ† ๋ฆฌ์ฝ” 18ํ™”์ฏค์— ๋‚˜์˜จ๋‹ค.

 

๋ชฉ์ฐจ

1. ๋ฒ„๋ธ”๋ง

2. ์บก์ฒ˜๋ง


1. ๋ฒ„๋ธ”๋ง

ํ•œ ์š”์†Œ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด,

1. ์ด ์š”์†Œ์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•˜๊ณ ,

2. ์ด์–ด์„œ ๋ถ€๋ชจ ์š”์†Œ์˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์˜ ์กฐ์ƒ ์š”์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ์š”์†Œ ๊ฐ๊ฐ์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ œ์ผ ๊นŠ์€ ๊ณณ์— ์žˆ๋Š” ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•ด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํ๋ฆ„์„

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>

<form onclick="alert('form')>FORM
  <div onclick="alert('div')">DIV
    <p onclick="alert('p')>P</p>
  </div>
</form>

์œ„ ์˜ˆ์‹œ๋Š” form - div - p ๋กœ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ ์š”์†Œ์— onclick์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํด๋ฆญํ•œ ์š”์†Œ๋ถ€ํ„ฐ ์ƒ์œ„ ์š”์†Œ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

 

1. event.target

event.target์€ ์‹ค์ œ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋œ ํƒ€๊ฒŸ ์š”์†Œ์ด๋‹ค.

// script.js
form.onclick = function(event) {
  setTimeout(() => {
    alert(`target: ${event.target.tagName}, this: ${this.tagName}`);
  }, 0);
};

//index.html
<!DOCTYPE HTML>
<html>
  <head>..</head>
  <body>
    <form id="form">FORM
      <div>DIV
        <p>P</p>
      </div>
    </form>
    <script src="script.js"></script>
  </body>
</html>

์—ฌ๊ธฐ์— CSS๊นŒ์ง€ ์ž‘์„ฑํ•ด์„œ form, div, p ์˜์—ญ์„ ๋‚˜๋ˆ„๊ณ  ๊ฐ ์˜์—ญ์„ ํด๋ฆญํ•˜๋ฉด

  • P ํด๋ฆญ : target: P, this: FORM
  • DIV ํด๋ฆญ : target: DIV, this: FORM
  • FORM ํด๋ฆญ : target: FORM, this: FORM

์ด๋Ÿฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

2. ๋ฒ„๋ธ”๋ง ์ค‘๋‹จํ•˜๊ธฐ

๋ฒ„๋ธ”๋ง์€ ๊ผญ ๋ฉˆ์ถฐ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ง‰์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฑฐ์˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ event.stopPropagation()์„ ์‚ฌ์šฉํ•ด์„œ ๋ฒ„๋ธ”๋ง์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ธ๋“ค๋Ÿฌ๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ›„, ๋ฒ„๋ธ”๋ง์„ ์ค‘๋‹จํ•œ๋‹ค.

<body onclick="alert(`๋ฒ„๋ธ”๋ง ๋ชป์˜ด`)">  // alert๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค
  <button onclick="event.stopPropagation()">ํด๋ฆญ</button>
</body>

 


2. ์บก์ฒ˜๋ง

์บก์ฒ˜๋ง์€ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์ž์ฃผ ์“ฐ์ด์ง€๋Š” ์•Š์œผ๋‚˜, ์ข…์ข… ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

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

 

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

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

2. ํƒ€๊นƒ ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ์‹ค์ œ ํƒ€๊นƒ ์š”์†Œ์— ์ „๋‹ฌ๋˜๋Š” ๋‹จ๊ณ„

3. ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„

<!DOCTYPE HTML>
<html>
  <head> .. </head>
  <body>
    <div>
      <table>
        <tbody>
          <tr>
            <td>..</td>
            <td>..</td>

      ....

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์„ ๋•Œ <td>๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๋™์ž‘์˜ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. ์ตœ์ƒ์œ„ ์กฐ์ƒ์—์„œ ์•„๋ž˜๋กœ ์ด๋ฒคํŠธ ์ „ํŒŒ (์บก์ฒ˜๋ง) : window - document - html - body - table ...

2. ์ด๋ฒคํŠธ๊ฐ€ ํƒ€๊นƒ ์š”์†Œ์— ๋„์ฐฉํ•˜์—ฌ ์‹คํ–‰๋จ (ํƒ€๊นƒ)

3. ๋‹ค์‹œ ์œ„๋กœ ์ „ํŒŒ๋จ (๋ฒ„๋ธ”๋ง)

 

์บก์ฒ˜๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์žก์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š”

addEventListener์˜ capture ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

elem.addEventListener(..., {capture: true});
// or
elem.addEventListener(..., true);

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•