[Deep Dive] Event(1)

link717ยท2021๋…„ 9์›” 13์ผ
0

Deep Dive

๋ชฉ๋ก ๋ณด๊ธฐ
26/28
post-thumbnail

๐ŸŒผ Event

๋ธŒ๋ผ์šฐ์ €๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํŠน์ • ์‚ฌ๊ฑด(event)์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์–ด๋–ค ์ผ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž…์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋  ํ•จ์ˆ˜๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์•Œ๋ ค ํ˜ธ์ถœ์„ ์œ„์ž„ํ•œ๋‹ค.

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ˜ธ์ถœ์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ

๐ŸŒผ 40.3 ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„์€ ์ด๋ฒคํŠธ ์•ž์— on ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™ํžŒ ํ˜•ํƒœ์ด๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ์„ ํ• ๋‹นํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก๋˜๋Š”๋ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ์„ ํ• ๋‹นํ•œ๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์€ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ•จ์ˆ˜ ๋ชธ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹์„ ์•Œ์•„๋‘๋Š” ๊ฒƒ์€ ์ข‹์œผ๋‚˜ HTML๊ณผ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    • ์ตœ๊ทผ์— ์‚ฌ์šฉ๋˜๋Š” Vue, React, Angular์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ ์šฉ๋˜๋Š” CBD(Component Based Development) ๋ฐฉ์‹์—์„œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="sayHi('hello')">Click me!</button>
    //์•„๋ž˜์˜ onclick ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ํŒŒ์‹ฑ๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
    //function onclick(event) {
    //  console.log('hello');
    //  console.log('world');
    //}
    <button onclick="console.log('hello'); console.log('world');">Click me!</button>
    <script>
      function sayHi(name) {
        console.log(`${name} world!`);
      }
    </script>
  </body>
</html>
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ: window ๊ฐ์ฒด์™€ Document, HTMLElement ํƒ€์ž…์˜ DOM ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์— ํ•จ์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค.

    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋Œ€๋ถ€๋ถ„ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ด๋ฒคํŠธ ํƒ€๊นƒ์— ๋ฐ”์ธ๋”ฉ ํ•˜์ง€๋งŒ ๊ฐ„ํ˜น ์ „ํŒŒ๋œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•  DOM๋…ธ๋“œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๋‹ค๋ฅด๊ฒŒ HTML๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„ž์ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์—๋Š” ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <button>Click me!</button>
    <script>
      //$button์€ ์ด๋ฒคํŠธ ํƒ€๊นƒ์ด๋‹ค.
      const $button = document.querySelector("button");

      $button.onclick = function () {
        console.log("first");
      };

      // ๋‘ ๋ฒˆ์งธ๋กœ ๋ฐ”์ธ๋”ฉ๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ๋™์ž‘๋œ๋‹ค.
      $button.onclick = function () {
        console.log("second");
      };
    </script>
  </body>
</html>
  • addEventListener ๋ฉ”์„œ๋“œ: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์™€ ๋‹ค๋ฅด๊ฒŒ addEventListener ๋ฉ”์„œ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ publish-subsribe pattern์„ ํ†ตํ•ด ๋™์ผํ•œ ์ด๋ฒคํŠธ ํƒ€์ž…์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹คํ–‰์€ ๋“ฑ๋ก๋œ ์ˆœ์„œ๋Œ€๋กœ์ด๋‹ค.
  EventTarget.addEventListener('eventType', eventHandler [, useCapture]);
  
  . EventTarget: ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ๊ฐ์‹œํ•  ์š”์†Œ ๋…ธ๋“œ
  . 'eventType': on ์ ‘๋‘์‚ฌ๋ฅผ ์ œ์™ธํ•œ ์ด๋ฒคํŠธ ํƒ€์ž…๋ช…
  . eventHandler: ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์œ„์ดํ•จ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
  . useCapture: ture(capturing ์‚ฌ์šฉ), false(bubbling ์‚ฌ์šฉ : ๊ธฐ๋ณธ๊ฐ’)

๐ŸŒผ 40.4 ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ œ๊ฑฐ

  • removeEventListener: addEventListener๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ removeEventListener์— ๋น ์ง์—†์ด ์ „๋‹ฌํ•ด์•ผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค. ๋˜ํ•œ ๋ฌด๋ช…ํ•จ์ˆ˜๋ฅผ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋“ฑ๋กํ•  ๊ฒฝ์šฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฐธ์กฐ๋ฅผ ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <button>Click me!</button>
    <script>
      const $button = document.querySelector("button");

      const handleClick = function () {
        console.log("click!");
      };

      $button.addEventListener("click", handleClick, true);
      
      // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์ „๋‹ฌํ–ˆ๋˜ ์ธ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.
      $button.removeEventListener("click", handleClick);
      // ์—ฌ๊ธฐ์„œ ์ œ๋Œ€๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.
      $button.removeEventListener("click", handleClick, true);
    </script>
  </body>
</html>

์ถœ์ฒ˜: ๋ชจ๋˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ Deep Dive-์ด์›…๋ชจ

profile
Turtle Never stop

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