๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ŒDevelopment/JavaScript

[JS] DOM & EVENT #6 ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง, ์ด๋ฒคํŠธ ์œ„์ž„

by geumsong 2023. 3. 27.
728x90

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

 

๋ชจ๋“  ์š”์†Œ์— ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ์ฝ˜์†”๋กœ๊ทธ๋ฅผ ์ฐ๋„๋ก ๋งŒ๋“ค์–ด๋ณด์ž.

  • ์•„๋ž˜๋Š” html์ฝ”๋“œ์ด๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์งฐ๊ตฌ๋‚˜๋งŒ ์ƒ๊ฐํ•˜๊ณ  ๋”ฐ๋ผ์˜ค๋ฉด ๋œ๋‹ค.
  • ์ฒจ๋ถ€๋œ css style sheet์˜ ๋‚ด์šฉ์€ ์ƒ๋žตํ•˜๊ฒ ๋‹ค.

โœ๏ธ์ž…๋ ฅ

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome</title>
  	<link href="../style.css" type="text/css" rel="stylesheet" />
  </head>
  <body>
    <div id="box">
        <ul id="list">
            <li id="color">Red</li>
        </ul>
    </div>
    <script>
        const box = document.getElementById("box");
        const list = document.getElementById("list");
        const color = document.getElementById("color");

        document.body.addEventListener("click", () => {
            console.log("1. body");
        });
        document.body.addEventListener("click", () => {
            console.log("2. div");
        });
        document.body.addEventListener("click", () => {
            console.log("3. ul");
        });
        document.body.addEventListener("click", () => {
            console.log("4. li");
        });
    </script>
  </body>
</html>

โœจ๊ฒฐ๊ณผ

 

  •  li๋ฅผ ํด๋ฆญํ•ด๋ณด๋ฉด  li, ul, div, body์ˆœ์œผ๋กœ ์ฐํžŒ๋‹ค.
  • ์ดˆ๋ก์ƒ‰ ๋„ค๋ชจ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ž๊ธฐ ์ž์‹ ์ธ div์™€ ๋ถ€๋ชจ์š”์†Œ์ธ body ๋ชจ๋‘ console์— ๋‚จ๊ฒจ์ง„๋‹ค.

 

โœ…์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • ์ž์‹์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” ๋ถ€๋ชจ์™€ ๊ทธ ๋ถ€๋ชจ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋œ๋‹ค.
  • ํ•˜์œ„์š”์†Œ์—์„œ ์ƒ์œ„์š”์†Œ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š”๊ฒƒ.
  • ๋” ์ด์ƒ ๋ถ€๋ชจ์š”์†Œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์€ ๋ฐ˜๋ณต๋œ๋‹ค.

 

 

  • li์—์„œ click ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ถ€๋ชจ์š”์†Œ๋กœ ์ „ํŒŒ๋œ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ชจ์Šต์ด ๊ฑฐํ’ˆ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค ํ•ด์„œ ์ด๊ฒƒ์„ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง(event bubbling)์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฒคํŠธ๋Š” ๋ฒ„๋ธ”๋ง์œผ๋กœ ์ „ํŒŒ๋˜์ง€๋งŒ ์ผ๋ถ€๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.  ์—ฌ๊ธฐ์„œ ์ผ๋ถ€๋Š” focus์™€ blur๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค.

 

์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์˜ ์ด๋ฒคํŠธ๋Š” ๋™์ž‘์€ ๊ฐ™์œผ๋‚˜, ๋ฒ„๋ธ”๋ง์—์„œ ์ฐจ์ด๊ฐ€๋‚œ๋‹ค.

 

 

์˜ˆ์‹œ1) focus ํ˜น์€ blur์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ, log์— ๋‚˜ํƒ€๋‚ด๋ณด์ž.

โœ๏ธ์ž…๋ ฅ

  • <body> - <div> - <input> ํƒœ๊ทธ๊ฐ€ ์žˆ๋‹ค.
  • ๊ฐ ์š”์†Œ๋“ค์€ focus์ด๋ฒคํŠธ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ blur์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ log๋ฅผ ์ฐ์–ด์ค€๋‹ค.

โœจ๊ฒฐ๊ณผ

  • input ์ฐฝ์— ํฌ์ปค์Šค๋ฅผ ํ•˜๋ฉด 3. input๋งŒ ์ฐํžŒ๋‹ค.

 

ํฌ์ปค์Šค๋ฅผ ๋ฒ—์–ด๋‚˜๋„ ๋˜‘๊ฐ™์ด 3.input๋งŒ ์ฐํžŒ๋‹ค.

์ด๋•Œ, focus๋ฅผ focusin์œผ๋กœ, blur๋ฅผ focusout์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

 

 

โœ๏ธ์ž…๋ ฅ

โœจ๊ฒฐ๊ณผ

3. input, 2. div, 1. body ์ˆœ์„œ๋กœ ์ฐํ˜”๋‹ค. 

focus๊ฐ€ ๋ฒ—์–ด๋‚˜๋„ ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๐Ÿ“์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ง‰๋Š”๋ฒ• 

  • ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ์ธ์œ„์ ์œผ๋กœ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
  • event.stopPropagation(); ์„ ์‹คํ–‰ํ•˜๊ธฐ

โœ๏ธ์ž…๋ ฅ

โœจ๊ฒฐ๊ณผ

  • focusin์„ ํ–ˆ์ง€๋งŒ ์ด๋ฒคํŠธ๋ฒ„๋ธ”๋ง์ด ๋ฐœ์ƒ๋˜์ง€ ์•Š์•˜๋‹ค. focusout ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€(์ด๊ฑด ์ƒ๋žตํ•˜๊ฒ ๋‹ค)
  • ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ง‰๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ด ์—†๊ธฐ๋•Œ๋ฌธ์— ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

 

 

 


2. ์ด๋ฒคํŠธ ์œ„์ž„

  • ์ž์‹ ์—๊ฒŒ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฅธ ์š”์†Œ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ!
  • ๋ฒ„๋ธ”๋ง์„ ์‚ฌ์šฉํ•ด์„œ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ๏ธ์ž…๋ ฅ

๐Ÿ“์ฝ”๋“œํ•ด์„

  • <li>๊ฐ€ 4๊ฐœ๊ฐ€ ์žˆ๊ณ  ํด๋ฆญ์„ ํ•˜๋ฉด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
  • clickHandler๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ๊ทธ ์•ˆ์— ๋ชจ๋“  <li>์— "on"class๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํด๋ฆญ๋œ <li>์— "on"class๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ ์žˆ๋‹ค.
  • clickHandler๋Š” li์˜ ๊ฐ๊ฐ ๋“ฑ๋ก๋˜๊ณ  ์žˆ๋‹ค. (ํ•˜๋‹จ document์— ์žˆ๋Š” ๋ถ€๋ถ„)

 

โœจ๊ฒฐ๊ณผ

๋ฌธ์ œ์ 

  • ์ง€๊ธˆ์€ <li>๊ฐ€ 4๊ฐœ์ง€๋งŒ ์ˆซ์ž๊ฐ€ 100๊ฐœ 200๊ฐœ๊ฐ€ ๋œ๋‹ค๋ฉด? ํ•˜๋‚˜ํ•˜๋‚˜ ์ถ”๊ฐ€,์ˆ˜์ •ํ•˜๋Š”๋“ฑ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค๊ฒƒ์ด๋‹ค.  
  • ์ด๋Ÿด ๋• li๊ฐ€ ์•„๋‹Œ ๋ถ€๋ชจ์š”์†Œ์ธ ul์— ์ด๋ฒคํŠธ๋ฅผ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ๏ธ์ž…๋ ฅ

  • ์ด ํ•œ ์ค„๋งŒ ์žˆ์œผ๋ฉด๋œ๋‹ค. 100๊ฐœ 200๊ฐœ๊ฐ€ ๋ผ๋„ ์ฝ”๋“œ ์ˆ˜์ •์ด ํ•„์š”์—†๋‹ค.
  • <li>์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ <ul>์— ๋“ฑ๋ก๋ผ ๋ถ€๋ชจ์š”์†Œ์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด๋ดค๋‹ค.

 

โœ๏ธ์ž…๋ ฅ

์™ผ์ชฝ์€ ์ „, ์˜ค๋ฅธ์ชฝ์€ ์ˆ˜์ • ํ›„

   event.target

: ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์š”์†Œ

   event.currentTarget

: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก๋œ ์š”์†Œ

: ์ง€๊ธˆ์€ ul์— ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด๋‘์—ˆ๋‹ค.

 

 

์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด target๊ณผ currentTarget์€ ๋™์ผํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ–ˆ์„๋•Œ ul (์ฃผํ™ฉ์ƒ‰๋ถ€๋ถ„)์„ ๋ˆ„๋ฅด๋ฉด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€๋‹ค.

๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

โœ๏ธ์ž…๋ ฅ

  • ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์„ ํด๋ฆญํ•ด๋„ ๋”์ด์ƒ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ์ง€์•Š๋Š”๋‹ค.

 

 

 

728x90

์ตœ๊ทผ๋Œ“๊ธ€

์ตœ๊ทผ๊ธ€

skin by ยฉ 2024 ttutta