์ด๋ฒคํธ ํธ๋ค๋ฌ์ Event
๊ฐ์ฒด
JavaScript์์๋ addEventListener()
๋ฉ์๋๋ฅผ ํตํด DOM ์์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ ์ ์๋ค. ๋ฑ๋ก๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ํธ์ถ๋ ๋ ์๋์ ์ผ๋ก Event
๊ฐ์ฒด๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ๋๋ค. ๋ณดํต ์์๋ก e
๋ event
๋ก ์ด๋ฆ์ง์ด ์ฌ์ฉํ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๊ธฐ์ ํด๋น๋๋ค. ์ด ์ด๋ฒคํธ ๊ฐ์ฒด๋ ์์ผ๋ก ๋ค๋ฃจ๊ฒ ๋ target
, currentTaget
๊ณผ ๊ฐ์ ํ๋กํผํฐ์ stopPropagation()
๊ณผ ๊ฐ์ ๋ฉ์๋ ๋ฑ์ ๊ฐ์ง๊ณ ์๋ค.
const input = document.querySelector('.input');
// ํ๋ผ๋ฏธํฐ๋ช
์ ๊ผญ e๊ฐ ์๋์ด๋ ๋๋ค.
const handleChange = (e) => {
const { name, value } = e.target;
console.log(name, value);
}
input.addEventListener('change', handleChange);
์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง
๋ถ๋ชจ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ์บก์ฒ๋ง๊ณผ ๋ฒ๋ธ๋ง์ด ์ฐจ๋ก๋๋ก ์คํ๋๋ค.
์ด๋ฒคํธ ์บก์ฒ๋ง์ ์ต์์ ๋ถ๋ชจ ์์์ธ html
์์์์๋ถํฐ ์ฒ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๊น์ง ์์ ์์๋ค์ ํ๊ณ ๋ด๋ ค๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋์ง ๊ฒ์ฌํ๊ณ , ์์ผ๋ฉด ๊ทธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋งํ๋ค. ๋ฐ๋๋ก ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ฒ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ถํฐ html
์์์ ์ด๋ฅด๊ธฐ๊น์ง ๋ถ๋ชจ ์์๋ค์ ํ๊ณ ์ฌ๋ผ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋์ง ๊ฒ์ฌํ๊ณ , ์์ผ๋ฉด ๊ทธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋งํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋ฒ๋ธ๋ง ๋จ๊ณ์ ๋์ํ๋๋ก ์ค์ ๋์ด ์๋ค. ์บก์ฒ๋ง ํ์ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด, ๋ชจ๋ ์บก์ฒ๋ง ํธ๋ค๋ฌ๊ฐ ๋จผ์ ํธ์ถ๋ ์ดํ ๋ฒ๋ธ๋ง ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋ ๊ฒ์ด๋ค.
target
ํ๋กํผํฐ์ currentTarget
ํ๋กํผํฐ ๋น๊ต
์ด ๋ ํ๋กํผํฐ๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง์ด ๋ฐ์ํ๋ ์๊ฐ์ ์ฐจ์ด๊ฐ ๋ช ํํด์ง๋ค.
๋จผ์ target
์ ์ด๋ฒคํธ๊ฐ ์ฒ์ ๋ฐ์ํ ๋์์ ๊ฐ๋ฆฌํจ๋ค. ๋ฐ๋ฉด์ currentTarget
์ ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ๋ง ํน์ ์บก์ฒ๋ง ๋๋ ๊ณผ์ ์์ ํ์ฌ ์ด๋ฒคํธ๊ฐ ์์นํ๊ณ ์๋ ๋์์ ๊ฐ๋ฆฌํจ๋ค. target
๊ณผ ๊ฐ์ ์์๋ฅผ ์ฐธ์กฐํ ์๋ ์๊ณ , ๋ค๋ฅผ ์๋ ์๋ ๊ฒ์ด๋ค.
๋ฒ๋ธ๋ง ์์
๋ฒ๋ธ๋ง ๋จ๊ณ์์์ e.target
๊ณผ e.currentTarget
์ ์ฐจ์ด๋ฅผ ํ์ธํด๋ณด๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์ค์ฒฉ๋ ๊ตฌ์กฐ์ ๋ ์ด์์์ ๋ง๋ค์๋ค.
const outer = document.createElement("div");
const inner = document.createElement("div");
const button = document.createElement("button");
outer.id = "outer";
inner.id = "inner";
button.id = "button";
outer.innerHTML = "outer";
inner.innerHTML = "inner";
button.innerHTML = "button";
inner.appendChild(button);
outer.appendChild(inner);
app.appendChild(outer);
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์์์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ printLog
ํจ์๋ฅผ ๋ฑ๋กํ๋ค.
function printLog(e) {
const { target, currentTarget } = e;
console.log(`currentTarget: ${currentTarget.id}, target: ${target.id}`);
}
outer.addEventListener("click", printLog);
inner.addEventListener("click", printLog);
button.addEventListener("click", printLog);
button
์์๋ฅผ ํด๋ฆญํ์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ผ๋ก ์ธํ์ฌ ๋ชจ๋ ์์์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฑ๋ก๋ printLog
ํจ์๊ฐ ํธ์ถ๋์์์ ํ์ธํ ์ ์๋ค. ์ด ๋, target
์ ์ต์ด๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ button
์ด๊ณ , currentTarget
์ button
๋ถํฐ ์์ํด ์ฐจ๋ก๋๋ก printLog
ํจ์๊ฐ ํธ์ถ๋ ๋ถ๋ชจ ์์๊ฐ ๋๋ค.
์ฟจํ๊ฒ ๋ฒ๋ธ๋ง ์ฒ๋ฆฌํ๊ธฐ
stopPropgation()
๋ stopImmediatePropagation()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ ์ ํ๋ฅผ ๋ง์ ์ ์๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์์์น ๋ชปํ ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํค๊ธฐ์ ๋ฑ ์ข๋ค. ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ถ๋ชจ ์์์ ์ ๋ง ํ์ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํด๋จ๋๋ฐ ๋ด๊ฐ ๋ฏธ์ฒ ๊ทธ๊ฑธ ์ธ์งํ์ง ๋ชปํ๊ณ ๋ฒ๋ธ๋ง์ ๋ง์๋ฒ๋ฆฐ๋ค๋ฉด? ๊ทธ ์๊ฐ ๊ณ ๋๊ณผ ์ญ๊ฒฝ์ ์์์ด๋ค.
๋ฐ๋ผ์ ์์ ๋ฐฉ๋ฒ๋ณด๋ค๋ target
๊ณผ currentTarget
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ถ์ฒํ๋ค.
function printLog(e) {
const { target, currentTarget } = e;
// ํด๋ฆญ๋ ๋์์ด ์๊ธฐ ์์ ์ผ ๋๋ง ๋ก์ง์ด ๋์ํ๋๋ก ์ฒ๋ฆฌํ๋ค.
if (target !== currentTarget) {
return;
}
console.log(`currentTarget: ${currentTarget.id}, target: ${target.id}`);
}
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ๋์ด์ ๋ฒ๋ธ๋ง ๋์ง ์๊ณ , ํด๋ฆญํ ์์์ ๋ฑ๋ก๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋๋ง ํธ์ถ์ด ๋์ด ์คํ๋๋ค.
์ฟจํ๊ฒ ์ด๋ฒคํธ ์์ํ๊ธฐ
์ฌ๋ฌ ์์ ์์์ ๋์ผํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํด์ผ ํ ๋, ๋ฒ๋ธ๋ง์ ์๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด ๋ถ๋ชจ ์์์๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๊ฒ์ ์ด๋ฒคํธ ์์์ด๋ผ ํ๋ค.
์์ดํ ์ ํด๋ฆญํ์ฌ ์ทจ์์ ์ ํ ๊ธํ๋ ์์ ์ด๋ค.
const ul = document.createElement("ul");
const li1 = document.createElement("li");
const li2 = document.createElement("li");
const li3 = document.createElement("li");
li1.innerHTML = "item 1";
li2.innerHTML = "item 2";
li3.innerHTML = "item 3";
ul.appendChild(li1);
ul.appendChild(li2);
ul.appendChild(li3);
app.appendChild(ul);
์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ด๋ ๊ฒ ๋๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฑ๋กํ๋ ๊ฒ์ด๋ค.
function toggleLineThrough(e) {
e.currentTarget.style.textDecoration = !e.currentTarget.style.textDecoration
? "line-through"
: "";
}
li1.addEventListener("click", toggleLineThrough);
li2.addEventListener("click", toggleLineThrough);
li3.addEventListener("click", toggleLineThrough);
์ด ๋๋ li
์์๋ค์ด ์ ๋ถ ๊ฐ์ ๋ถ๋ชจ ์๋์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ์๊ฒ ์ด๋ฒคํธ ์์์ ํ๋ ๋ฐฉ๋ฒ์ ์ถ์ฒํ๋ค. e.currentTaget
์ด ์๋๋ผ e.target
์ ์ฌ์ฉํ๊ณ ul
์์์ ๋ฑ ํ ๋ฒ๋ง toggleLineThrough
ํจ์๋ฅผ ๋ฑ๋กํ๋ฉด ๋๋ค.
function toggleLineThrough(e) {
// e.target์ ul์ด ์๋๋ผ ์ฒ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ li ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
e.target.style.textDecoration = !e.target.style.textDecoration
? "line-through"
: "";
}
ul.addEventListener("click", toggleLineThrough);