๐Ÿฅ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ

*index.html(์•„๋ž˜ ์˜ˆ์ œ ์ฐธ์กฐ์šฉ)

<body>
  <div class = 'parent'>
    <div class='child'>
      <a href="์ฃผ์†Œ" target="_blank">
        HEROPY!
      </a>
	</div>
  </div>
</body>

1. .addEventListner()

  • ๋Œ€์ƒ์— ์ด๋ฒคํŠธ ์ฒญ์ทจ(Listen)๋ฅผ ๋“ฑ๋ก
  • ๋Œ€์ƒ์— ์ง€์ •ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ง€์ •ํ•œ ํ•จ์ˆ˜(Handler)๊ฐ€ ํ˜ธ์ถœ๋จ
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')

parentEl.addEventListener('click', () => {
  console.log('Parent!')
})
childEl.addEventListener('click', () => {
  console.log('Child!')
})

์‹คํ–‰๊ฒฐ๊ณผ:
ํ•ด๋‹น๋ถ€๋ถ„ ํด๋ฆญ์‹œ ์ฝ˜์†”์— ์ถœ๋ ฅ
Parent!
Child!

2. .removeEventListener()

  • ๋Œ€์ƒ์— ๋“ฑ๋กํ–ˆ๋˜ ์ด๋ฒคํŠธ ์ฒญ์ทจ(Listen)๋ฅผ ์ œ๊ฑฐ
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')

const handler = () => {   //ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‘ ์œผ๋กœ์จ ์–ธ์ œ๋“  add/remove ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ = ์—ฌ๋Ÿฌ๊ณณ์—์„œ ๊ฐ™์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋จ
  console.log('Parent!')
}

parent.addEventListener('click', handler)  //ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์‹คํ–‰
childEl.addEventListener('click', () => {
  parent.removeEventListener('click', handler)  //child ์š”์†Œ ํด๋ฆญ ์‹œ parent์—์„œ ํ•ธ๋“ค๋Ÿฌ ์ œ๊ฑฐ-> parent์š”์†Œ์—์„œ ํด๋ฆญ์ด๋ฒคํŠธ ๋ฐœ์ƒํ•ด๋„ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ์•ˆ๋จ
})

๐Ÿฅ์ด๋ฒคํŠธ ๊ฐ์ฒด

  • ๋Œ€์ƒ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ทธ ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋จ
const parentEl = document.querySelector('.parent')

parentEl.addEventListener('click', event => {  //ํด๋ฆญ์‹œ ํด๋ฆญ ์ •๋ณด๊ฐ€ ์ด๋ฒคํŠธ๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด๊ฐ
  console.log(event.target /*์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ•ด๋‹น์š”์†Œ๋กœ ํด๋ฆญ ์˜์—ญ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ*/, event.currentTarget/*์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋œ ์š”์†Œ๋กœ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ ์ถœ๋ ฅ*/)
})
parentEl.addEventListener('wheel', event => {  //ํœ ์„ ๋‚ด๋ฆด ์‹œ deltaY๊ฐ’์ด ์–‘์ˆ˜
  console.log(event)
})

const inputEl = document.querySelector('input')
inputEl.addEventListener('keydown', event => {
  console.log(event.key)      //์ธํ’‹์ฐฝ์— ํ‚ค๋ณด๋“œ๋กœ ๋ˆ„๋ฅด๋Š” ํ‚ค ์ฝ˜์†”๋กœ ์ถœ๋ ฅ๋จ
})

๐Ÿฅ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€

1. ๋งˆ์šฐ์Šค ํœ ์˜ ์Šคํฌ๋กค ๋™์ž‘ ๋ฐฉ์ง€

const parent = document.querySelector('.parent')
parentEl.addEventListener('wheel'. event => {
  event.parentDefault()  //ํœ ์ด ์ฝ˜์†”์—๋Š” ์ถœ๋ ฅ๋˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜์ง„ ์•Š์Œ
  console.log('Wheel!')
})

2. aํƒœ๊ทธ์—์„œ ํŽ˜์ด์ง€ ์ด๋™ ๋ฐฉ์ง€

const anchor = document.querySelector('a')
anchorEl.addEventListener('click', event => {
  event.preventDefault()
  console.log('Click!')
})

๐Ÿฅ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ฒ˜๋ง

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

  • ํ›„์† ์š”์†Œ๋กœ๋ถ€ํ„ฐ ๋” ์ƒ์œ„ ์š”์†Œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ (๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ€์žฅ ๊นŠ์ด ์žˆ๋Š” ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•ด DOM ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋ถ€๋ชจ ์š”์†Œ๋กœ ํ•œ ๋‹จ๊ณ„์”ฉ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ)

  • ์—ฌ๋Ÿฌ ์š”์†Œ์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒ์œ„ ์š”์†Œ์— ํ•œ ๋ฒˆ๋งŒ ์„ค์ •ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

  • ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ์ •์ง€: ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ํŠน์ • ๋ถ€๋ถ„์—์„œ ์ •์ง€ ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ
    event.stopPropagation() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

  • ์ •์ง€ ๋ถ€๋ถ„์˜ ์œ„๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ๋ฒ„๋ธ”๋ง ๋™์ž‘ํ•จ

  • ์˜ˆ์ œ

window.addEventListener('click', event => {
  console.log('Window')
})

document.body.addEventListener('click', event => {
  console.log('Body')
})

parentEl.addEventListener('click', event => {
  console.log('Parent')    //ํ•ด๋‹น ๋ถ€๋ถ„ ํด๋ฆญ์‹œ ์ด ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋ฒ„๋ธ”๋ง ๋จ
})

childEl.addEventListener('click', event => {
  console.log('Child')   
  event.stopPropagation()   //๋ฒ„๋ธ”๋ง ์ •์ง€
})

amchorEl.addEventListener('click', event => {
  console.log('Anchor')
})

์‹คํ–‰๊ฒฐ๊ณผ:
(a ํƒœ๊ทธ ๋ถ€๋ถ„ ํด๋ฆญ)
Anchor
Child

- ์ด๋ฒคํŠธ ์บก์ฒ˜๋ง

  • ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ (์ด๋ฒคํŠธ ์บก์ฒ˜๋ง์—์„œ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์ตœ์ƒ์œ„ ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, DOM ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ๋Œ€์ƒ ์š”์†Œ๋กœ ์ „๋‹ฌ)

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

  • capture: true ์‚ฌ์šฉ

  • ์˜ˆ์ œ

window.addEventListener('click', event => {
  console.log('Window')
})

document.body.addEventListener('click', event => {
  console.log('Body')
}, {capture: true})   //์ด ๋ถ€๋ถ„ ๋จผ์ € ์‹คํ–‰

parentEl.addEventListener('click', event => {
  console.log('Parent')
})

childEl.addEventListener('click', event => {
  console.log('Child')    //body๋ถ€๋ถ„ ์‹คํ–‰ ํ›„ ์ด ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฒ„๋ธ”๋ง
})

amchorEl.addEventListener('click', event => {
  console.log('Anchor')
})

์‹คํ–‰ ๊ฒฐ๊ณผ:
(Child ๋ถ€๋ถ„ ํด๋ฆญ)
Body
Child
Parent
Window

๐Ÿฅ์ด๋ฒคํŠธ ์˜ต์…˜

- ํ•ธ๋“ค๋Ÿฌ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰

const parentEl = document.querySelector('.parent')

parentEl.addEventListener('click', event => {
  console.log('Parent')
}, {
  once: true   //์ฝ˜์†”์— ํ•œ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋จ
})

- ๊ธฐ๋ณธ ๋™์ž‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ๋ถ„๋ฆฌ

const parentEl = document.querySelector('.parent')

parentEl.addEventListener('wheel', () => {
  for (let i = 0; i < 10000; i +={
    console.log(i)
  }
}, {
  passive: true  //์Šคํฌ๋กค์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋จ
})

-> ์ฒ˜๋ฆฌํ•  ๋กœ์ง์ด ๋งŽ์•„์„œ ํ™”๋ฉด์˜ ์›€์ง์ž„์ด ๋Š๋ ค์งˆ ๋•Œ ์‚ฌ์šฉ

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

: ๋น„์Šทํ•œ ํŒจํ„ด์˜ ์—ฌ๋Ÿฌ ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹จ์ผ ์กฐ์ƒ ์š”์†Œ์—์„œ ์ œ์–ดํ•˜๋Š” ์ด๋ฒคํŠธ ์œ„์ž„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

const parentEl = document.querySelector('.parent')
const childEls = document.querySelectorAll('.child')

//๋ชจ๋“  ๋Œ€์ƒ ์š”์†Œ์— ์ด๋ฒคํŠธ ๋“ฑ๋ก
childEls.forEach(el => {
  el.addEventListener('click', event => {
    console.log(event.target.textContent)  //๊ฐ™์€ ๋กœ์ง์„ child ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต(child ๊ฐœ์ˆ˜๋งŒํด ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก)
  })
})

//์กฐ์ƒ ์š”์†Œ์— ์ด๋ฒคํŠธ ์œ„์ž„
parentEl.addEventListener('click', event => { //ํ•˜๋‚˜์˜ ์กฐ์ƒ ์š”์†Œ์—๋งŒ ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€(ํ•˜๋‚˜์˜ ํ•ธ๋“ค๋Ÿฌ ๋ถ€๋ถ„๋งŒ ๋“ฑ๋ก)
  const childEl = event.target.closest('.child')  //๋Œ€์ƒ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์กฐ์ƒ ์š”์†Œ ์ฐพ๊ธฐ
  if (childEl) {   //์ฐธ์ธ ๊ฒฝ์šฐ ์ฝ˜์†”์— ์ถœ๋ ฅ
    console.log(childEl.textContent)
  }
})

๐Ÿฅ๋งˆ์šฐ์Šค์™€ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ

  • click : ํด๋ฆญ ํ–ˆ์„ ๋•Œ
  • dblclick : ๋”๋ธ” ํด๋ฆญํ–ˆ์„ ๋•Œ
  • mousedown : ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ
  • mouseenter : ํฌ์ธํ„ฐ๊ฐ€ ์š”์†Œ ์œ„๋กœ ๋“ค์–ด๊ฐˆ ๋•Œ
  • mouseup : ๋ฒ„ํŠผ์„ ๋—„ ๋•Œ
  • mouseleave : ๋งˆ์šฐ์Šค๊ฐ€ ์š”์†Œ ๋ฐ–์œผ๋กœ ๋‚˜์˜ฌ ๋•Œ
  • mousemove : ํฌ์ธํ„ฐ๊ฐ€ ์›€์ง์ผ ๋•Œ
  • contextmenu : ์šฐํด๋ฆญ ํ–ˆ์„ ๋•Œ
  • wheel : ํœ  ๋ฒ„ํŠผ์ด ํšŒ์ „ํ•  ๋•Œ
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')

childEl.addEventListener('click', () => {
  childEl.classList.toggle('active')
})
childEl.addEventListener('mousedown', () => {
  childEl.classList.add('active')
})
childEl.addEventListener('mouseup', () => {
  childEl.classList.remove('active')
})
childEl.addEventListener('mousemove', event => {
  console.log(event)
})
childEl.addEventListener('contextmenu', event => {
  event.preventDefault()   //๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€-> ์šฐํด๋ฆญ์˜ ๋ฉ”๋‰ด๋“ค ๋ณด์ด์ง€ ์•Š์Œ
  console.log(event)
})
parentEl.addEventListener('wheel', event => {
  console.log(event)
})

๐Ÿฅํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ

  • keydown : ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ
  • keyup : ํ‚ค๋ฅผ ๋—„ ๋•Œ

- ๋ˆ„๋ฅธ ํ‚ค๊ฐ€ ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ

const inputEl = document.querySelector('input')

inputEl.addEventListener('keydown', event => {
  console.log(event.key)  
})

- ์ž…๋ ฅํ•œ ๋‚ด์šฉ์ด ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ

const inputEl = document.querySelector('input')

inputEl.addEventListener('keydown', event => {
  if (event.key === 'Enter') {
    console.log(event.target.value)   
  }
})
  • CJK๋ฌธ์ž: ์ค‘๊ตญ์–ด, ํ•œ๊ตญ์–ด, ์ผ๋ณธ์–ด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด ํ•œ๋‹จ๊ณ„ ๋” ํ•„์š”ํ•ด์„œ ๋‘๋ฒˆ ์ถœ๋ ฅ๋จ

- ์ž…๋ ฅ์„ ์™„๋ฃŒํ•˜๋Š” ํ‚ค(์—”ํ„ฐ, ํƒญ ๋“ฑ)์™€ ํ•œ๊ธ€์„ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

const inputEl = document.querySelector('input')

inputEl.addEventListener('keydown', event => {
  if (event.key === 'Enter' && !event.isComposing => {
    console.log(event.isComposing)
    console.log(event.target.value)   
  }
})

๐Ÿฅ์–‘์‹(form)๊ณผ ํฌ์ปค์Šค ์ด๋ฒคํŠธ

  • focus : ์š”์†Œ๊ฐ€ ํฌ์ปค์Šค๋ฅผ ์–ป์—ˆ์„ ๋•Œ
  • blur : ์š”์†Œ๊ฐ€ ํฌ์ปค์Šค๋ฅผ ์žƒ์—ˆ์„ ๋•Œ
  • input : ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
  • change : ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
  • submit : ์ œ์ถœ ๋ฒ„ํŠผ์„ ์„ ํƒํ–ˆ์„ ๋•Œ
  • reset : ๋ฆฌ์…‹ ๋ฒ„ํŠผ์„ ์„ ํƒํ–ˆ์„ ๋•Œ

๐Ÿฅ์ปค์Šคํ…€ ์ด๋ฒคํŠธ

- ๋””์ŠคํŒจ์น˜(๊ฐ•์ œ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ)

const child1 = document.querySelector('.child:nth-child(1)')
const child2 = document.querySelector('.child:nth-child(2)')

child addEventListener('click', event => {
  child2.dispatchEvent(new Event('click'))
  child2.dispatchEvent(new Event('wheel'))
})
child2.addEventListener('click', event => {
  conosole.log('Child2 click')
})
child2.addEventListener('wheel', event => {
  conosole.log('Child2 wheel')
})

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

const child1 = document.querySelector('.child:nth-child(1)')
const child2 = document.querySelector('.child:nth-child(2)')

child1.addEventListener('hello-world', event => {
  console.log('์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋ฐœ์ƒ')
  console.log(event.detail)   //์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ํ–ˆ์„ ๋•Œ๋งŒ detail ์†์„ฑ์œผ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ
})

child2.addEventListener('click', () => {
  child1.dispatchEvent(new CustumEvent('hello-world'))
  detail: 123  //์ฝ˜์†”์— ์ถœ๋ ฅ๋  ๋‚ด์šฉ ์ „๋‹ฌ
})

์‹คํ–‰ ๊ฒฐ๊ณผ:
child 2๋ฒˆ์˜ ์š”์†Œ๋ฅผ ํด๋ฆญํ•ด๋„ child 1๋ฒˆ์— ์ ์šฉ๋œ ์ด๋ฒคํŠธ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ์ฝ˜์†”์— ์ถœ๋ ฅ

profile
๋ ›์ธ ๊ณ  ์Šคํ„ฐ๋”” ๋ ›์ธ ๊ณ  ์Šคํ„ฐ๋”” ์˜ˆ ๋ ›์ธ ๊ณ  ์˜ค์˜ค์˜ค ์Šคํ„ฐ๋”” ๋ ›์ธ ๊ณ  ์Šคํ„ฐ๋”” ์˜ˆ

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด