*index.html(์๋ ์์ ์ฐธ์กฐ์ฉ)
<body>
<div class = 'parent'>
<div class='child'>
<a href="์ฃผ์" target="_blank">
HEROPY!
</a>
</div>
</div>
</body>
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')
parentEl.addEventListener('click', () => {
console.log('Parent!')
})
childEl.addEventListener('click', () => {
console.log('Child!')
})
์คํ๊ฒฐ๊ณผ:
ํด๋น๋ถ๋ถ ํด๋ฆญ์ ์ฝ์์ ์ถ๋ ฅ
Parent!
Child!
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) //์ธํ์ฐฝ์ ํค๋ณด๋๋ก ๋๋ฅด๋ ํค ์ฝ์๋ก ์ถ๋ ฅ๋จ
})
const parent = document.querySelector('.parent')
parentEl.addEventListener('wheel'. event => {
event.parentDefault() //ํ ์ด ์ฝ์์๋ ์ถ๋ ฅ๋์ง๋ง ์ค์ ๋ก ๋์ํ์ง ์์
console.log('Wheel!')
})
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)
}
})
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)
})
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)
}
})
const inputEl = document.querySelector('input')
inputEl.addEventListener('keydown', event => {
if (event.key === 'Enter' && !event.isComposing => {
console.log(event.isComposing)
console.log(event.target.value)
}
})
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๋ฒ์ ์ ์ฉ๋ ์ด๋ฒคํธ์ ์ฝ๋ฐฑํจ์๊ฐ ๋์ํ์ฌ ์ฝ์์ ์ถ๋ ฅ