๐Ÿ“‹ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive | 40์žฅ ์ด๋ฒคํŠธ

waterglassesยท2022๋…„ 7์›” 1์ผ
0
post-thumbnail

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive ๋„์„œ์˜ 40์žฅ ์ด๋ฒคํŠธ๋ฅผ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

40.1 ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

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

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

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

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

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

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก์ด๋ž€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด๋ผ ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋กํ•  ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ์„ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋“ฑ๋กํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด onclick="sayHi('Lee')"์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ํŒŒ์‹ฑ๋˜์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ํ‚ค onclick ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹น๋œ๋‹ค.

function onclick(event){
  sayHi('Lee')
}

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

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

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋ฒคํŠธ ํƒ€๊นƒ๊ณผ ์ด๋ฒคํŠธ ํƒ€์ž…, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

// $button: ์ด๋ฒคํŠธ ํƒ€๊นƒ
// on + ์ด๋ฒคํŠธ ํƒ€์ž…
// function: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
$button.onclick = function () {
  console.log('button click')
}

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

40.3.3 addEventListerner ๋ฉ”์„œ๋“œ ๋ฐฉ์‹

EventTarget.addEventListener('eventType', functionName, [, useCapture])
// ์ด๋ฒคํŠธ ํƒ€๊นƒ.addEventListener(์ด๋ฒคํŠธ ํƒ€์ž…, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, capture ์‚ฌ์šฉ ์—ฌ๋ถ€)

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

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

addEventListener ๋ฉ”์„œ๋“œ๋กœ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด EventTarget.prototype.removeEventListener ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ „๋‹ฌํ•  ์ธ์ˆ˜๋Š” addEventListener ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๋‹ค.

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

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

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

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๋„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค. ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ๋”๋ถˆ์–ด ์ƒ์„ฑ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ผ์›์ด ๋œ๋‹ค.

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

Event ์ธํ„ฐํŽ˜์ด์Šค ์ฆ‰, Event.prototype์— ์ •์˜๋˜์–ด ์žˆ๋Š” ์ด๋ฒคํŠธ๊ด€๋ จ ํ”„๋กœํผํ‹ฐ๋Š” UIEvent, CustomEvent, MouseEvent ๋“ฑ ๋ชจ๋“  ํŒŒ์ƒ ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ์ƒ์†๋œ๋‹ค. Event ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฒคํŠธ ๊ด€๋ จ ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ์ƒ์†๋ฐ›๋Š” ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ๋‹ค.

  • type: ์ด๋ฒคํŠธ ํƒ€์ž…
  • target: ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†Œ
  • currentTarget: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ DOM ์š”์†Œ

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

DOM ํŠธ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜๋Š” DOM ์š”์†Œ ๋…ธ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” DOM ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋œ๋‹ค. ์ด๋ฅผ ์ด๋ฒคํŠธ ์ „ํŒŒ๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†Œ์ธ ์ด๋ฒคํŠธ ํƒ€๊นƒ์„ ์ค‘์‹ฌ์œผ๋กœ DOM ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋œ๋‹ค.

  • ์บก์ฒ˜๋ง ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„ ์š”์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ
  • ํƒ€๊นƒ ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํƒ€๊นƒ์— ๋„๋‹ฌ
  • ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„: ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ์—์„œ ์ƒ์œ„ ์š”์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ

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

์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ DOM ์š”์†Œ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ ์ƒ์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

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

40.8.1 DOM ์š”์†Œ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์ค‘๋‹จ

preventDefault ๋ฉ”์„œ๋“œ๋Š” DOM์š”์†Œ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ค‘๋‹จ์‹œํ‚จ๋‹ค.

40.8.2 ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์ง€

stopPropagation ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ์ค‘์ง€์‹œํ‚จ๋‹ค.

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

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

handleClick ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ๊ฐ์ฒด window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

<button onclick="handleClick()">Click me</button>
<script>
  function handleClick() {
    console.log(this) // window
  }
</script>

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

<button onclick="handleClick(this)">Click me</button>
<script>
  function handleClick(button) {
    console.log(button) // ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ button ์š”์†Œ
  }
</script>

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

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ฆ‰, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ currentTarget ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ ์ด๋ฒคํŠธ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์ž์ฒด์˜ this ๋ฐ”์ธ๋”ฉ์„ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.

<button class="btn1">0</button>
<script>
  const $button1 = document.querySelector('.btn1')
  
  $button1.addEventListener('click', e => {
    console.log(this) // window
    console.log(e.currenetTarget) // $button1
  })
  
  // window.textContent์— NaN(undefined + 1)์„ ํ• ๋‹นํ•œ๋‹ค.
  ++this.textContent
</script>

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

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

๊ฐœ๋ฐœ์ž์˜ ์˜๋„๋กœ ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ผ ํ•œ๋‹ค.

์ด๋ฒคํŠธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ด๋ฒคํŠธ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

// KeyBoardEvent ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ keyup ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const ketboardEvent = new KeyboardEvent('keyup')
console.log(ketboardEvent.type) // keyup

// CustomEvent ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ foo ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const customEvent = new CustomEvent('foo')
console.log(customEvent.type) // foo

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” bubbles์™€ cancelable ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด false๋กœ ๊ธฐ๋ณธ ์„ค์ • ๋˜์–ด์žˆ์–ด์„œ ๋ฒ„๋ธ”๋ง๋˜์ง€ ์•Š๊ณ  preventDefault ๋ฉ”์„œ๋“œ๋กœ ์ทจ์†Œํ•  ์ˆ˜๋„ ์—†๋‹ค.

๋งŒ์•ฝ์— ์ด ๋ถ€๋ถ„์„ true๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‘๋ฒˆ์งธ ์ธ์ˆ˜๋กœ bubbles ๋˜๋Š” cancelable ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

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

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

// ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜(๋™๊ธฐ ์ฒ˜๋ฆฌ). click ์ด๋ฒคํŠธ ๋ฐœ์ƒ
$button.dispatchEvent(customEvent)

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ dispatchEvent ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋™๊ธฐ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๋ฅผ ๋””์ŠคํŒจ์น˜ ํ•˜๊ธฐ ์ด์ „์— ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์•ผํ•œ๋‹ค.

๊ธฐ์กด ์ด๋ฒคํŠธ ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ addEventListener๋ฉ”์„œ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

Ref

  • ์ด์›…๋ชจ ์ €, โŒœ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep DiveโŒŸ, ์œ„ํ‚ค๋ถ์Šค
profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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