๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ“– study

[9์ฃผ์ฐจ ์Šคํ„ฐ๋””]40์žฅ-์ด๋ฒคํŠธ

by HomieKim 2022. 3. 27.

์ด๋ฒคํŠธ

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

    ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ผ ํ•œ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก

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

์ธ๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹

  • HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ค‘์— ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ๋‹ค.
  • ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ ๋“ฑ์˜ ๋ฌธ์„ ํ• ๋‹นํ•ด์•ผํ•จ
<!DOCTYPE html>
<html>
<body>
  <button onclick="sayHi('Lee')">Click me!</button>
  <script>
    function sayHi(name) {
      console.log(`Hi! ${name}.`);
    }
  </script>
</body>
</html>
  • ์ด๋•Œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋  ์ธ๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ•จ์ˆ˜ ๋ชธ์ฒด๋ฅผ ์˜๋ฏธ (ํŒŒ์‹ฑ๋˜์–ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ)
  • ๋ฆฌ์•กํŠธ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•จ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹

  • window ๊ฐ์ฒด์™€ Document, HTMLElement ํƒ€์ž…์˜ DOM ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ํ•จ์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก ๋œ๋‹ค.
<!DOCTYPE html>
<html>
<body>
  <button>Click me!</button>
  <script>
    const $button = document.querySelector('button');

    // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉ
    $button.onclick = function () {
      console.log('button click');
    };
  </script>
</body>
</html>
  • ํ”„๋กœํผํ‹ฐ์— ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

addEventListener ๋ฉ”์„œ๋“œ ๋ฐฉ์‹

  • EventTarget.prototype.addEventListener ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  • ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ์ด๋ฒคํŠธ ํƒ€์ž…, ๋‘๋ฒˆ์งธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ , ์„ธ๋ฒˆ์งธ๋Š” ์ด๋ฒคํŠธ ์ „ํŒŒ ๋‹จ๊ณ„๋ฅผ ์ „๋‹ฌ

    ์ด๋ฒคํŠธ ์ „ํŒŒ ๋‹จ๊ณ„๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ false๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜, true๋ฅผ ์ง€์ •ํ•˜๋ฉด ์บก์ฒ˜๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ณ , ๋“ฑ๋ก ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ (๋‹จ, ๋™์ผํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ค‘๋ณต ๋“ฑ๋กํ•˜๋ฉด ํ•˜๋‚˜๋งŒ ๋“ฑ๋ก๋จ)

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

  • addEventListener ๋กœ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด removeEventListener ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  • ๋ฌด๋ช… ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋“ฑ๋กํ•˜๋ฉด ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฐธ์กฐ๋ฅผ ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•ด์•ผ ํ•จ.

    ๊ฐ€๊ธ‰์  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฐธ์กฐ๋ฅผ ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•˜์—ฌ ์ œ๊ฑฐ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

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

  • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ์— ๊ด€๋ จํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋จ
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ.
  • ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋จ
  • ์ด๋•Œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋ก ํ•˜๋ฉด ์ด๋ฒคํŠธ ๊ฐ์ฒด ์ด๋ฆ„์„ ๋ฐ˜๋“œ์‹œ event๋กœ ๋ฐ›์•„์•ผ๋จ (์•”๋ฌต์ ์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—)

์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ

  • ์ƒ์† ๊ตฌ์กฐ
    enter image description here

  • Event, UIEvent, MouseEvent ๋“ฑ์€ ๋ชจ๋‘ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐ€๋Šฅ.

  • ์ฆ‰, ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ผ์›.

  • Event ์ธํ„ฐํŽ˜์ด์Šค๋Š” DOM ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ„.

  • ๋ชจ๋“  ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ , ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ด๋ฒคํŠธ ํƒ€์ž…์— ๋”ฐ๋ผ ๊ณ ์œ ํ•œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ •์˜.

์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ

๊ณตํ†ต ํ”„๋กœํผํ‹ฐ ์„ค๋ช… ํƒ€์ž…
type ์ด๋ฒคํŠธ ํƒ€์ž… string
target ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†Œ DOM ์š”์†Œ ๋…ธ๋“œ
currentTarget ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”์ธ๋”˜๋œ DOM ์š”์†Œ DOM ์š”์†Œ ๋…ธ๋“œ
target ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†Œ DOM ์š”์†Œ ๋…ธ๋“œ
eventPhase ์ด๋ฒคํŠธ ์ „ํŒŒ ๋‹จ๊ณ„
0: ์—†์Œ, 1: ์บก์ฒ˜๋ง, 2: ํƒ€๊นƒ, 3: ๋ฒ„๋ธ”๋ง
number
bubbles ์ด๋ฒคํŠธ๋ฅผ ๋ฒ„๋ธ”๋ง์œผ๋กœ ์ „ํŒŒํ•˜๋Š”์ง€ ์—ฌ๋ถ€ boolean
cancleable preventDefault ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ boolean
defaultPrevented preventDefault ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œ ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€ boolean
isTrusted ์‚ฌ์šฉ์ž์˜ ํ–‰์œ„์— ์˜ํ•ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์ธ์ง€ ์—ฌ๋ถ€ boolean
timeStamp ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ number

๋งˆ์šฐ์Šค ์ •๋ณด ์ทจ๋“

  • MouseEvent ํƒ€์ž…์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ์œ ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

    ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ์˜ ์ขŒํ‘œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ

  • screenX / screenY : ์‚ฌ์šฉ์ž ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ขŒํ‘œ
  • clientX / clientY : ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์›นํŽ˜์ด์ง€๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœํ•œ ์ขŒํ‘œ
  • pageX / pageY : ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ขŒํ‘œ
  • offsetX / offsetY : ์ขŒํ‘œ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๊ฑธ๋ ค์žˆ๋Š” DOM node๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ขŒํ‘œ๋ฅผ ํ‘œ์‹œ

๋ฒ„ํŠผ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€ ๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ

  • altKey
  • ctrlKey
  • shiftKey
  • button

์ด๋ฒคํŠธ ์ „ํŒŒ

  • DOM ํŠธ๋ฆฌ ์ƒ์— ์กด์žฌ ํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” DOM ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ ๋œ๋‹ค.
  • ์ด๋ฅผ ์ด๋ฒคํŠธ ์ „ํŒŒ(event propagation) ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†Œ์ธ ์ด๋ฒคํŠธ ํƒ€๊ฒŸ(event target)์„ ์ค‘์‹ฌ์œผ๋กœ DOM ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ

enter image description here

  • ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ 3๋‹จ๊ณ„๋กœ ๊ตฌ๋ถ„

    • ์บก์ฒ˜๋ง ๋‹จ๊ณ„(capturing phase) : ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„์š”์†Œ๋กœ๋กœ ์ „ํŒŒ
    • ํƒ€๊ฒŸ ๋‹จ๊ณ„(target phase) : ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํƒ€๊ฒŸ์— ๋„๋‹ฌ
    • ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„ (bubbling phase) : ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ์—์„œ ์ƒ์œ„ ์š”์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ
  • ์ฆ‰, ์ด๋ฒคํŠธ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ์ด๋ฒคํŠธ ํƒ€๊นƒ์€ ๋ฌผ๋ก  ์ƒ์œ„ DOM ์š”์†Œ์—์„œ๋„ ์บ์น˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์„ธ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ capturing ์‚ฌ์šฉ ์—ฌ๋ถ€ ์ง€์ • ๊ฐ€๋Šฅ

  • ๊ธฐ๋ณธ ๊ฐ’ false๋กœ ๋ณดํ†ต ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•จ

  • ๋ฒ„๋ธ”๋ง์„ ํ†ตํ•ด ์ „ํŒŒ ๋˜์ง€ ์•Š๋Š” ์ด๋ฒคํŠธ๋„ ์กด์žฌ ํ•จ

    • mouseenter : ๋งˆ์šฐ์Šค์ปค์„œ๋ฅผ HTML ์š”์†Œ ์•ˆ์œผ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒ (๋ฒ„๋ธ”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค.)
    • mouseover : mouseenter๋ž‘ ๋™์ผ, ๋ฒ„๋ธ”๋ง ๋˜๋Š”๊ฒŒ ์ฐจ์ด
    • mouseleave : ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ HTML์š”์†Œ ๋ฐ–์œผ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ (๋ฒ„๋ธ”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค.)
    • mouseout : mouseleave ์™€ ๋™์ผ, ๋ฒ„๋ธ”๋ง ๋˜๋Š”๊ฒŒ ์ฐจ์ด

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

  • ์ด๋ฒคํŠธ ์œ„์ž„(event delegation)์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ DOM์š”์†Œ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ ์ƒ์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ ์œ„์Œ์„ ํ†ตํ•ด ์ƒ์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ํ•˜์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ํ•„์š” ์—†๋‹ค.
  • ์ด ๊ฒฝ์šฐ target ํ”„๋กœํผํ‹ฐ์™€ currentTarget ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

    ์˜ˆ๋ฅผ๋“ค์–ด ul ํƒœ๊ทธ์— ํ•˜์œ„ liํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    ul ํƒœ๊ทธ์— ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋ก
    currentTarget์€ ulํƒœ๊ทธ ์š”์†Œ, target์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ li ํƒœ๊ทธ ์š”์†Œ

DOM ์š”์†Œ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์กฐ์ž‘

  • DOM ์š”์†Œ๋Š” ์ €๋งˆ๋‹ค ๊ธฐ๋ณธ ๋™์ž‘์ด ์กด์žฌ
  • ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ preventDefault ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ๋™์ž‘์„ ์ค‘์ง€
  • ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ์ „ํŒŒ๋ฅผ ์ค‘์ง€ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด stopPropagation ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ ๋ทฐํŠธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฒคํŠธ ๋“ฑ๋ก์‹œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” window ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ์™œ๋ƒ, ์•”๋ฌต์ ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— (์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ this๋Š” window)

  • ๋‹จ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ this ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ ๊ฐ€๋ฆฌํ‚ด
<!DOCTYPE html>
<html>
<body>
  <button onclick="handleClick(this)">Click me</button>
  <script>
    function handleClick(button) {
      console.log(button); // ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ button ์š”์†Œ
      console.log(this);   // window
    }
  </script>
</body>
</html>

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹๊ณผ addEventListener ๋ฐฉ์‹

  • ๋‘ ๋ฐฉ์‹์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • class ์‚ฌ์šฉ ์‹œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ ํ•ด์•ผํ•œ๋‹ค.
  • ์—๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ ๋ฐ”์ธ๋”ฉ ์‹œ bind ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ ํ•  ์ธ์Šคํ„ด์Šค ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์•ผํ•จ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์ธ์ˆ˜ ์ „๋‹ฌ

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹ ๋˜๋Š” addEventListener ๋ฐฉ์‹ ์‚ฌ์šฉ ์‹œ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•จ์œผ๋กœ ๋‚ด๋ถ€์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ธ์ˆ˜ ์ „๋‹ฌ ํ•˜๋ ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ธ์ˆ˜ ์ „๋‹ฌ
  • ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ

์ปค์Šคํ…€ ์ด๋ฒคํŠธ

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์ƒ์„ฑ

  • ์ด๋ฒคํŠธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์›๋ž˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ ๋˜์„œ ์ด๋ฒคํŠธ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ ํƒ€์ž…์ด ๊ฒฐ์ •
  • ๊ทผ๋ฐ ์ด๋ฒคํŠธ ์ƒ์„ฑ์ž๋กœ ์ž„์˜๋กœ ์ƒ์„ฑํ•œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฒคํŠธ ํƒ€์ž… ์ง€์ •๊ฐ€๋Šฅ
  • ์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ์ƒ์„ฑํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.
// MouseEvent ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ click ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const mouseEvent = new MouseEvent('click', {
  bubbles: true,
  cancelable: true,
  clientX: 50,
  clientY: 100
});

console.log(mouseEvent.clientX); // 50
console.log(mouseEvent.clientY); // 100

// KeyboardEvent ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ keyup ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const keyboardEvent = new KeyboardEvent('keyup', { key: 'Enter' });

console.log(keyboardEvent.key); // Enter

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜

  • ์ƒ์„ฑ๋œ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋Š” dispatchEvent๋ฉ”์„œ๋“œ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • dispatchEvent ๋ฉ”์„œ๋“œ์— ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ.
<!DOCTYPE html>
<html>
<body>
  <button class="btn">Click me</button>
  <script>
    const $button = document.querySelector('.btn');

    // ๋ฒ„ํŠผ ์š”์†Œ์— click ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋ก
    // ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ๋””์ŠคํŒจ์น˜ํ•˜๊ธฐ ์ด์ „์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.
    $button.addEventListener('click', e => {
      console.log(e); // MouseEvent {isTrusted: false, screenX: 0, ...}
      alert(`${e} Clicked!`);
    });

    // ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์ƒ์„ฑ
    const customEvent = new MouseEvent('click');

    // ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜(๋™๊ธฐ ์ฒ˜๋ฆฌ). click ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    $button.dispatchEvent(customEvent);
  </script>
</body>
</html>
  • ๊ธฐ์กด์˜ ์ด๋ฒคํŠธ ํƒ€์ž…์ด ์•„๋‹Œ ์ž„์˜์˜ ์ด๋ฒคํŠธ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด CustomEven ์ด๋ฒคํŠธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์‚ฌ์šฉ
// CustomEvent ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ foo ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const customEvent = new CustomEvent('foo');
console.log(customEvent.type); // foo

์ž„์˜์˜ ์ด๋ฒคํŠธ ํƒ€์ž… ์ง€์ • ๊ฒฝ์šฐ addEventListener ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด์•ผํ•จ
on+์ด๋ฒคํŠธํƒ€์ž… ์œผ๋กœ ์ง€์ •๋œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

๋Œ“๊ธ€