ARTICLE | DOM Events

noopyยท2021๋…„ 8์›” 24์ผ
0

๐Ÿ“ƒ ARTICLE

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail
post-custom-banner

๋‚˜๋„ ์ด์ œ ์ด์ž˜์•Œ ~! (์ด๋ฒคํŠธ ์ž˜์•Ž )

์งฑ๊ตฌ ์งค

๐Ÿก ์ด๋ฒคํŠธ

๋ธŒ๋ผ์šฐ์ €์—๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์ด๋ฒคํŠธ๋“ค์ด ์žˆ๋‹ค.

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ

click โ€“ ์š”์†Œ ์œ„์—์„œ ๋งˆ์šฐ์Šค ์™ผ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ
contextmenu โ€“ ์š”์†Œ ์œ„์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐœ์ƒ.
mouseover์™€ mouseout โ€“ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์š”์†Œ ์œ„๋กœ ์›€์ง์˜€์„ ๋•Œ, ์ปค์„œ๊ฐ€ ์š”์†Œ ๋ฐ–์œผ๋กœ ์›€์ง์˜€์„ ๋•Œ ๋ฐœ์ƒ.
mousedown๊ณผ mouseup โ€“ ์š”์†Œ ์œ„์—์„œ ๋งˆ์šฐ์Šค ์™ผ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ์žˆ์„ ๋•Œ, ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ๋—„ ๋•Œ ๋ฐœ์ƒ.
mousemove โ€“ ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์ผ ๋•Œ ๋ฐœ์ƒ.

ํผ ์š”์†Œ ์ด๋ฒคํŠธ

submit โ€“ ์‚ฌ์šฉ์ž๊ฐ€ <form> ์„ ์ œ์ถœํ•  ๋•Œ ๋ฐœ์ƒ.
focus โ€“ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณผ ๊ฐ™์€ ์š”์†Œ์— ํฌ์ปค์Šค ํ•  ๋•Œ ๋ฐœ์ƒ.

ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ

keydown๊ณผ keyup โ€“ ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋—„ ๋•Œ ๋ฐœ์ƒ

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

DOMContentLoaded โ€“ HTML์ด ์ „๋ถ€ ๋กœ๋“œ ๋ฐ ์ฒ˜๋ฆฌ๋˜์–ด DOM ํŠธ๋ฆฌ ์™„์„ฑ ์ฆ‰์‹œ ๋ฐœ์ƒ.
โš ๏ธ <img>๋‚˜ ์Šคํƒ€์ผ์‹œํŠธ ๋“ฑ์˜ ๊ธฐํƒ€ ์ž์›์€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ.
load - DOM ํŠธ๋ฆฌ ์™„์„ฑ + ์ด๋ฏธ์ง€, ์Šคํƒ€์ผ์‹œํŠธ ๊ฐ™์€ ์™ธ๋ถ€ ์ž์›๋„ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์™”์„ ๋•Œ ๋ฐœ์ƒ

CSS ์ด๋ฒคํŠธ

transitionend โ€“ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒ.

๐Ÿก addEventListener()

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ.

onClick vs addEventListner('click')

ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. onClick
element.onClick = function () {} 

// ํ˜น์€
element.attachMent('onclick', function () {})

// ํ˜น์€ HTML ์ฝ”๋“œ ์ƒ์—์„œ ์‚ฌ์šฉ
<div onclick ="alert('hello')">ํด๋ฆญ</div>
  1. addEventListener
element.addEventListener ('click', function () {})

๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”๋ฐ, ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

1. onclick์€ ํ•˜๋‚˜์˜ ๋ฆฌ์Šค๋„ˆ๋งŒ ์ง€์ •

const element = document.querySelector('#testing');
element.onclick = () => alert('onclick 1๋ฒˆ ์‹คํ–‰');
element.onclick = () => alert('onclick 2๋ฒˆ ์‹คํ–‰');
element.addEventListener('click', () => alert('addEventListener 1๋ฒˆ ์‹คํ–‰'))
element.addEventListener('click', () => alert('addEventListener 2๋ฒˆ ์‹คํ–‰'))

onClick์€ ํ•˜๋‚˜์˜ ๋ฆฌ์Šค๋„ˆ๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ ,
addEventListener๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

addEventListener๋Š” IE8 ์ดํ•˜์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค.

3. ๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง ์„ค์ • ์—ฌ๋ถ€

addEventListener๋Š” 3๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง ๋™์ž‘ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด๋ฒคํŠธ ์œ„์ž„์—์„œ ์•Œ์•„๋ณด์ž ^ใ…‡^

๐Ÿก ์ด๋ฒคํŠธ ์œ„์ž„

์ถœ์ฒ˜: ๊น€๋ฒ„๊ทธ | DOM ์ด๋ฒคํŠธ ํ”Œ๋กœ์šฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€๋‹ค.

<html>
  <body>
    <div></div>
  </body>
</html>

div๋ฅผ ๋ˆŒ๋ €๋Š”๋ฐ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๊ฑธ๋ ค์žˆ๋‹ค๋ฉด ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋•Œ ๋งŒ์•ฝ ๋ถ€๋ชจ ์š”์†Œ์—๊ฒŒ๋„ click ์ด๋ฒคํŠธ๊ฐ€ ๊ฑธ๋ ค์žˆ๋‹ค๋ฉด?

const h1 = document.querySelector('h1');
h1.addEventListener('click', () => alert('h1 ํด๋ฆญ'));
document.body,addEventListener('click', () => alert('body ์‹คํ–‰'))

๊ด€๋ จ๋œ ๊ด€๊ณ„์ž๋“ค์ด ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด, ์ „์› ์‹คํ–‰๋œ๋‹ค.

currentTarget, target

currentTarget: ํ˜„์žฌ ์š”์†Œ. (ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ• ๋‹น๋œ ์š”์†Œ) = this
target: ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋œ ์š”์†Œ

event-flow

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๊ด€๋ จ๋œ ๊ด€๊ณ„์ž๋“ค์„ ๋ชจ๋‘ ์‹คํ–‰์‹œ์ผœ๋ฒ„๋ฆฌ๋ฏ€๋กœ
์ด๋ฒคํŠธ ํ๋ฆ„์„ ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์บก์ณ๋ง(Capture phase)

propagation up(์ „ํŒŒํ•˜๋‹ค)๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

๋งจ ํ•˜์œ„ ์ž์‹ ์š”์†Œ์ธ div๋ฅผ ํด๋ฆญํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ 
๋ธŒ๋ผ์šฐ์ €(window)์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณณ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

Target phase

์ด๋ฒคํŠธ์˜ ์ง„์งœ target.
๋‹น์‚ฌ์ž ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ.

๋ฒ„๋ธ”๋ง(Bubble phase)

propagation down ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.
target์—์„œ ๋ธŒ๋ผ์šฐ์ €๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๋Š” Capture ๐Ÿ‘‰๐Ÿป Target ๐Ÿ‘‰๐Ÿป Bubbie ํ๋ฆ„์„ ํ†ตํ•ด
์š”์†Œ์— ํ• ๋‹น๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์–‘์žํƒ์ผ

div ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผฐ์„ ๋ฟ์ธ๋ฐ, ๋„ˆ๋ฌด ๋งŽ์€ ๋‹จ๊ณ„๊ฐ€ ์ค‘๋ณต๋˜๊ณ  ์žˆ๋‹ค~!~! ๐Ÿ™€
ํ•ฉ๋ฆฌ์ ์ด๊ฒŒ๋„, ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์œ„์ž„๋œ ์นœ๊ตฌ๋“ค์—๊ฒŒ ์„ ํƒ์ง€๋ฅผ ์ค€๋‹ค.
์ฆ‰ (currentTarget !== target) ์ธ ๊ฒฝ์šฐ.

[MDN | addEventListener]์„ ์ž ๊น ์‚ดํŽด๋ณด๋ฉด, addEventListener์˜ 3๋ฒˆ์งธ ์ธ์ž๊ฐ€ useCapture : false ์˜ต์…˜์ธ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, ๊ธฐ๋ณธ๊ฐ’์€ bubble์ด๊ณ  ๋„ˆ ์บก์ณ๋ง์—์„œ ์‹คํ–‰๋ ๋ž˜ ~? ๋ผ๊ณ  ๋ฌผ์–ด๋ด์ฃผ๋Š” ๊ฒƒ ใ…œ

stopPropagation

stopPropagation: ๋‚ด ๋‹ค์Œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ ํ๋ฆ„ ๋ฉˆ์ถฐ~!

์–ด๋””์— ๋„์›€๋ ๊นŒ?

currentTarget: ํ˜„์žฌ ์š”์†Œ. (ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ• ๋‹น๋œ ์š”์†Œ)
target: ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋œ ์š”์†Œ

์•ž์„œ ๋ฐฐ์šด eventflow์™€ target ๊ฐœ๋…์„ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const $ul = document.querySelector('ul');

$ul.addEventListener('click', (e) => {
  console.log(e.target);
})

์ด๋ฒคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ„๋ธ”๋ง์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
์ฆ‰, ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” ์ƒ์œ„ ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์—ฌ๊ธฐ์„œ ํ•˜์œ„์š”์†Œ์ธ <li>๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ <li>์—์„œ ์‹œ์ž‘๋˜์—ˆ๊ณ ,
์‹ค์ œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ• ๋‹น๋œ ์š”์†Œ๋Š” ul์ด๊ธฐ ๋•Œ๋ฌธ์—
e.target : <li>,
e.currentTarget : <ul>
๊ฐ€ ๋œ๋‹ค.

โš ๏ธ ํด๋ฆญํ•œ ์ง€์ ์ด ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋ผ ํ•˜๋”๋ผ๋„,
์ƒ์œ„ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ด๋ฒคํŠธ ์œ„์ž„์„ ํ™œ์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋Œ€์‹ ,
ํ•˜๋‚˜์˜ ๋ฆฌ์Šค๋„ˆ๋กœ ๋น„์Šทํ•œ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค!

์ฐธ๊ณ  ์‚ฌ์ดํŠธ)

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠœํ† ๋ฆฌ์–ผ | ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ ์†Œ๊ฐœ

profile
๐Ÿ’ช๐Ÿป ์•„๋Š” ๊ฑธ ์„ค๋ช…ํ•  ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ
post-custom-banner

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

comment-user-thumbnail
2021๋…„ 8์›” 30์ผ

on์ด๋ฒคํŠธ๋Š” 1๋ฒˆ๋งŒ ๋“ฑ๋ก๋˜์–ด ์‹คํ–‰๋˜๋Š”๊ฒƒ์„ ๋ฐฐ์›Œ๊ฐ‘๋‹ˆ๋‹ค.
addEventListener๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ์ด๋ฒคํŠธ๊ฐ€ ์„ค์ •๋˜์„œ ์ž˜๋ชปํ•˜๋ฉด ์“ธ๋ฐ์—†์ด ์ด๋ฒคํŠธ๊ฐ€ ์Œ“์ด๋Š”๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜๊ธดํ•ด์—ฌ...ใ…‹ใ…‹ใ…‹
์›ํ”ผ์Šค์งค ์ธ์ƒ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋‹ต๊ธ€