[ JS ] JavaScript EVENT

๋ฉ”์ดยท2024๋…„ 5์›” 1์ผ

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
9/12

๐Ÿ“– EVENT (Document Object Model)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script defer src="./event.js"></script>
    <title>Document</title>
    <style>
      .parent {
        width: 400px;
        height: 200px;
        margin: 40px;
        padding: 20px;
        border: 5px solid;
        background-color: red;
        overflow: auto;
      }
      .child {
        width: 300px;
        height: 100px;
        margin-bottom: 20px;
        border: 5px solid;
        background-color: orange;
        font-size: 40px;
      }
    </style>
</head>
<body>
  <div class="parent">
    <div class="child">
      <a href="http://apple.com" target="_blank">์‚ฌ๊ณผ</a>
    </div>
    <div class="child">
      <a href="http://google.com" target="_blank">๋ฐ”๋‚˜๋‚˜</a>
    </div>
    <div class="child">
      <a href="http://heropy.dev" target="_blank">์ฒด๋ฆฌ</a>
    </div>
  </div>
</body>
</html>

01. ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ

.addEventListener

  • ๋Œ€์ƒ.addEventListener(์ด๋ฒคํŠธ์ข…๋ฅ˜, ํ•ธ๋“ค๋Ÿฌ) : ๋Œ€์ƒ์—์„œ ์ฒญ์ทจ(Listen)ํ•  ์ด๋ฒคํŠธ ์ข…๋ฅ˜์™€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•  ์ฝœ๋ฐฑ(Handler)
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')

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

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

.removeEventListener

  • ๋Œ€์ƒ.removeEventListener(์ด๋ฒคํŠธ์ข…๋ฅ˜, ํ•ธ๋“ค๋Ÿฌ) : ๋Œ€์ƒ์— ๋“ฑ๋กํ–ˆ๋˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ธฐ๋ช…ํ•จ์ˆ˜๋ฅผ ๊ผญ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')

const handler = () => {
    console.log('Parent!')
}

parentEl.addEventListener('click', handler)
childEl.addEventListener('click', () => {
    parentEl.removeEventListener('click', handler)
})

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

  • .addEventListener() ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒซ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ, ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
const parentEl = document.querySelector('.parent')

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

const inputEl = document.querySelector('input')
inputEl.addEventListener('keydown', event => {
    console.log(event.key)
    console.log(inputEl.value)
    console.log(event.target.value)
})

03. ์ด๋ฒคํŠธ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€

event.preventDefalut( )

: ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

// <a> ํƒœ๊ทธ์—์„œ ํŽ˜์ด์ง€ ์ด๋™ ๋ฐฉ์ง€!
const anchorEl = document.querySelector('a')
anchorEl.addEventListener('click', event => {
  event.preventDefault()
  console.log('Click!')
})

// ๋งˆ์šฐ์Šค ํœ ์˜ ์Šคํฌ๋กค ๋™์ž‘ ๋ฐฉ์ง€!
const parentEl = document.querySelector('.parent')
parentEl.addEventListener('wheel', event => {
  event.preventDefault()
})

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

event.stopPropagation( )

: ํ•˜์œ„ ์š”์†Œ์—์„œ ์ƒ์œ„ ์š”์†Œ๋กœ์˜ ์ด๋ฒคํŠธ ์ „ํŒŒ(๋ฒ„๋ธ”)๋ฅผ ์ •์ง€ํ•œ๋‹ค.

const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')
const anchorEl = document.querySelector('a')


window.addEventListener('click', () => {
  console.log('Window!')
})
document.documentElement.addEventListener('click', () => {
  console.log('HTML!')
})
document.body.addEventListener('click', () => {
  console.log('Body!')
})
parentEl.addEventListener('click', (event) => {
  console.log('Parent!')
  event.stopPropagation() //๋ฒ„๋ธ”๋ง ์ •์ง€
})
childEl.addEventListener('click', () => {
  console.log('Child!')
})
anchorEl.addEventListener('click', (event) => {
  console.log('Anchor!')
  event.preventDefault()
})

Anchor!
Child!
Parent!
(์‚ฌ๊ณผ๋ฅผ ๋ˆ„๋ฅด๋ฉด)


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

{ capture: true }

: ์ด๋ฒคํŠธ ์บก์ฒ˜๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
: ์บก์ฒ˜๋œ ์š”์†Œ๋Š” ๋งจ ์œ„๋กœ ์˜ฎ๊ฒจ์ง

const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')
const anchorEl = document.querySelector('a')


window.addEventListener('click', () => {
  console.log('Window!')
})
document.documentElement.addEventListener('click', () => {
  console.log('HTML!')
})
document.body.addEventListener('click', () => {
  console.log('Body!')
}, {
  capture: true
})
parentEl.addEventListener('click', () => {
  console.log('Parent!')
}, {
  capture: true
})
childEl.addEventListener('click', () => {
  console.log('Child!')
})
anchorEl.addEventListener('click', (event) => {
  console.log('Anchor!')
  event.preventDefault()
})

Body!
Parent!
Anchor!
Child!
HTML!
Window!
(์‚ฌ๊ณผ๋ถ€๋ถ„์„ ๋ˆ„๋ฅด๋ฉด)


06. ํ•œ๊ธ€ ์ž…๋ ฅ ์ด๋ฒคํŠธ ์ค‘๋ณต

event.isComposing

: ๋ธŒ๋ผ์šฐ์ € ์ž…๋ ฅ๊ธฐ์˜ CJK ๋ฌธ์ž ๊ตฌ์„ฑ ์ค‘์—๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ 2๋ฒˆ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
: ํ•œ๊ธ€ ์ž…๋ ฅ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

const inputEl = document.querySelector('input')

inputEl.addEventListener('keydown', event => {
  if (event.isComposing) return
  if (event.key === 'Enter') {
    const h1El = document.createElement('h1')
    h1El.textContent = inputEl.value
    document.body.append(h1El)
  }
})


07. ๋งˆ์šฐ์Šค์™€ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ

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

childEls.forEach(childEl => {
  // click - ํด๋ฆญํ–ˆ์„ ๋•Œ
  // dblclick - ๋”๋ธ” ํด๋ฆญํ–ˆ์„ ๋•Œ
  childEl.addEventListener('click', () => {
    childEl.classList.toggle('active')
  })

  // contextmenu - ์šฐํด๋ฆญํ–ˆ์„ ๋•Œ
  childEl.addEventListener('contextmenu', event => {
    event.preventDefault()
    console.log(childEl.textContent)
  })
})
profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ์ฝ”๋ฆฐ์ดโ‚Šโ‹† โ˜พโ‹†โบ

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