๐ŸŽ Event ๋ฐœ์ƒ๊ณผ Event ๊ฐ์ฒด ์•Œ์•„๋ณด๊ธฐ(์บก์ณ๋ง, ๋ฒ„๋ธ”๋ง, ์œ„์ž„)

Lee Jooamยท2022๋…„ 5์›” 18์ผ
0
post-thumbnail
post-custom-banner

๐Ÿ‘† ์ด๋ฒคํŠธ?

์ด๋ฒคํŠธ๋Š” ์‹œ์Šคํ…œ์—์„œ ์ผ์–ด๋‚˜๋Š” ์‚ฌ๊ฑด ํ˜น์€ ๋ฐœ์ƒ์ด๋‹ค. ์‹œ์Šคํ…œ์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ '์‹ ํ˜ธ'๋ฅผ ๋ณด๋‚ด๊ณ  ์›ํ•œ๋‹ค๋ฉด ์ด๋ฒคํŠธ์— ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์‘๋‹ต๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค...!

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ์œˆ๋„์šฐ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.
=> ์—ฌํƒœ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํŠน์ • ์š”์†Œ์— ๋ถ€์ฐฉ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.

๐Ÿ‘† ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ

์›น์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฌ๊ฒŒ ๋‘ ๊ณผ์ •์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ ๊ทธ ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ์˜ ์‘๋‹ต์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์ง€์ •ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

<button class="button" onclick="handleClick()">๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!</button>
document.querySelector('.button').addEventListener('click', handleClick);

๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ๋ณด๋‹ค๋Š” js ํŒŒ์ผ์—์„œ addEventListener ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

์ธ๋ผ์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ณ , HTML ํŒŒ์ผ ๋‚ด์— ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋“ค์–ด์žˆ์œผ๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„์ด ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‚ด ์ƒ๊ฐํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ๋Š” ์‹œ์Šคํ…œ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ์ผ๊ด€์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜์— ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

document.querySelector('.button').onclick = handleClick;

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœํผํ‹ฐ๋กœ๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ๊ฒฝ์šฐ๋„ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ ๋“ฑ๋ก ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.

๋ชจ๋˜ํ•œ ๋ฐฉ๋ฒ•์ธ addEventListener, removeEventListener ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ด๋ฒคํŠธ๋ฅผ ํƒˆ๋ถ€์ฐฉํ•˜๋Š” ๊ฒŒ ๊ถŒ์žฅ๋œ๋‹ค.

๐Ÿ‘† ์ด๋ฒคํŠธ ๊ฐ์ฒด

function handleClick(e) {
  console.log(e);
}

document.querySelector(".btn").onclick = handleClick;
window.addEventListener("keyup", (e) => {
  console.log(e);
});

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ์— ๊ทธ๊ฒƒ์„ ์ „๋‹ฌํ•œ๋‹ค. ์œ„์—์„œ ๊ฐ๊ฐ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ์™€ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ console์— ์ถœ๋ ฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด์—๋Š” ๋‹ค์–‘ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ์˜ ์œ„์น˜๋ถ€ํ„ฐ alt๋‚˜ shift ํ‚ค์˜ ๋ˆŒ๋ฆผ ์—ฌ๋ถ€๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์„ธ์„ธํ•œ ์ •๋ณด๋“ค๋„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์“ฐ์ด๊ฒ ์ง€๋งŒ ์—ฌํƒœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋˜ ๊ฑด ์ด๋ฒคํŠธ์˜ target์— ๋Œ€ํ•œ ์ •๋ณด์ด๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ํƒ€๊ฒŸ์„ ์ค‘์‹ฌ์œผ๋กœ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ๋‹ค.

target์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ง๊ด€์ ์ด๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ๋ฅผ target์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

<input type="number" name="numberInput" id="inputId" />
function handleClick(e) {
  console.log(e.target.value);
  console.log(e.target.name);
}

์ด์ฒ˜๋Ÿผ input์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ€์ฐฉํ•˜๋ฉด ์ฐธ์กฐ ๋Œ€์ƒ์˜ value๋‚˜ name ๋˜ํ•œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด target์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ถ€์ฐฉ๋œ ์š”์†Œ์ผ๊นŒ?

๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๋ง์˜ ์˜๋ฏธ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

๐Ÿ‘† ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง, ์บก์ฒ˜๋ง

์šฐ์„  ์ด๋ฒคํŠธ์˜ ์‹คํ–‰ ๊ณผ์ •๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

<body>
	<button class="btn">๋ฒ„ํŠผ์ด๊ธ”</button>
</body>
document
  .querySelector(".btn")
  .addEventListener("click", () => alert("target: btn"));
document
  .querySelector("body")
  .addEventListener("click", () => alert("bubbled body"));
document
  .querySelector("body")
  .addEventListener("click", () => alert("captured body"), { capture: true });

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

"captured body" => "target: btn" => "bubbled body" ์ˆœ์œผ๋กœ alert ์ฐฝ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์ง€๋งŒ ์‚ฌ์‹ค์ƒ body๋ฅผ ํด๋ฆญํ–ˆ๋‹ค๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. body ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ๋ฒ„ํŠผ์ด๊ธฐ ๋•Œ๋ฌธ์— body๋ฅผ ํด๋ฆญํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ ๋˜ํ•œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ์œ„์—์„œ ํ•˜์œ„๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒํ•˜๋Š” ํ˜„์ƒ์ด ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์„ event capturing์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์บก์ณ๋ง์„ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 3๋ฒˆ์งธ ์ด๋ฒคํŠธ ๋“ฑ๋ก์ฒ˜๋Ÿผ option์œผ๋กœ capture ์„ค์ •์„ ํ•˜๋ฉด ๋œ๋‹ค.

์บก์ณ๋Š” ์„ค๋ช…๊ณผ ๊ฐ™์ด ์ง๊ด€์ ์ด๋‹ค. ๋ถ€๋ชจ๋ฅผ ํด๋ฆญํ•ด์•ผ ์ž์‹์„ ํด๋ฆญ๋˜๋‹ˆ ๋ง์ด๋‹ค.

ํ•˜์ง€๋งŒ "bubbled body"๋Š” ๋ชจํ˜ธํ•˜๋‹ค. ์ด๊ฒƒ ๋˜ํ•œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์˜ ํŠน์ง•์ธ๋ฐ ์ด๋ฒคํŠธ ์บก์ณ๋ง๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ์ž‘์šฉํ•œ๋‹ค.

์ด๋ฒคํŠธ ๋ฐœ์ƒ ์š”์†Œ์ธ ํƒ€๊ฒŸ์œผ๋กœ๋ถ€ํ„ฐ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๊นŒ์ง€ ๋น„๋ˆ—๋ฐฉ์šธ์ฒ˜๋Ÿผ ์˜ฌ๋ผ๊ฐ€๋Š” ํ˜„์ƒ, ์ด๊ฒŒ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด๋‹ค.

๐Ÿ‘† target, currentTarget

document.querySelector(".btn").addEventListener("click", (e) => {
  console.log("target: btn");
  console.log("  target: ", e.target);
  console.log("  cTarget: ", e.currentTarget);
});
document.querySelector("body").addEventListener("click", (e) => {
  console.log("bubbled body");
  console.log("  target: ", e.target);
  console.log("  cTarget: ", e.currentTarget);
});
document.querySelector("html").addEventListener("click", (e) => {
  console.log("bubbled html");
  console.log("  target: ", e.target);
  console.log("  cTarget: ", e.currentTarget);
});
document.querySelector("body").addEventListener(
  "click",
  (e) => {
    console.log("captured body");
    console.log("  target: ", e.target);
    console.log("  cTarget: ", e.currentTarget);
  },
  { capture: true }
);

์ด๋ฒคํŠธ์˜ target์€ ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ๋กœ ์บก์ณ๋ง-๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ์ค‘์•™์ ์ธ target์— ํ•ด๋‹นํ•œ๋‹ค.

์ฆ‰ ์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋œ ์š”์†Œ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ๊ทธ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ target์€ ํ•ญ์ƒ button์ด๋‹ค. ๋งŒ์•ฝ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ถ€์ฐฉ๋œ ์š”์†Œ๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ด๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ currentTarget์ด๋‹ค. ์ด๊ฒƒ๋„ console์—์„œ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ถ€์ฐฉ๋œ ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด event.target์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ, event.currentTarget์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ถ€์ฐฉ๋œ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ, ์ฆ‰ ํ•ธ๋“ค๋Ÿฌ์˜ this๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘† ์ด๋ฒคํŠธ ์œ„์ž„

๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง ์ฒ˜์Œ ๋งˆ์ฃผํ•˜๋ฉด ๋ฒˆ๊ฑฐ๋กญ๊ธฐ๋งŒ ํ•˜๋‹ค. ์™œ ์ด๋Ÿฐ ๊ฑธ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ์˜๋ฌธ์ด์ง€๋งŒ ์ด๋Ÿฐ ํ˜„์ƒ์„ ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

<ul class="container">
  <li class="item">item1</li>
  <li class="item">item2</li>
  <li class="item">item3</li>
  <li class="item">item4</li>
  <li class="item">item5</li>
  <li class="item">item6</li>
  <li class="item">item7</li>
  <li class="item">item8</li>
  <li class="item">item9</li>
  <li class="item">item10</li>
</ul>

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ ์—˜๋ฆฌ๋จผํŠธ๋“ค์ด ์žˆ์„ ๋•Œ ๊ฐ๊ฐ์„ ํด๋ฆญํ•  ๋•Œ innerText๋ฅผ ์–ป๊ณ  ์‹ถ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ง๊ด€์ ์œผ๋กœ ๋– ์˜ค๋ฅด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

document
  .querySelectorAll(".container .item")
  .forEach((item) =>
    item.addEventListener("click", (e) => console.log(e.target.innerText))
  );

๊ทธ๋ƒฅ NodeList๋ฅผ ๊ตฌํ•˜๊ณ  forEach ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ๊ฐ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋งŒ์•ฝ item์ด 1๋งŒ๊ฐœ๋ผ๋ฉด ์–ด๋–จ๊นŒ? 1๋งŒ๊ฐœ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ€์ฐฉํ•ด์•ผํ•œ๋‹ค. ๋ณ„๋กœ ๋งค๋ ฅ์ ์ธ ๋ฐฉ์•ˆ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์•„์ฃผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

document
  .querySelector(".container")
  .addEventListener("click", (e) => console.log(e.target.innerText));

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค!

์ด๋ฒคํŠธ๊ฐ€ ๋ถ€๋ชจ๋กœ ๊ณ„์† ์ „ํŒŒ๋˜๋Š” ๋ฒ„๋ธ”๋ง์˜ ํŠน์„ฑ์„ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ์œ„์ž„์ด๋ผ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

<li class="item">
  item1
  <div>hello?</div>
</li>

๊ฐ™์€ ์ฝ”๋“œ์—์„œ li๊ฐ€ div๋ฅผ ํ’ˆ๊ณ  ์žˆ๋Š” ํ˜•ํƒœ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ div๋ฅผ ํด๋ฆญํ–ˆ์„ ๋• ์•„๋ฌด ์ผ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  div๊ฐ€ ์•„๋‹Œ li ์˜์—ญ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๋‹ค.

document.querySelector(".container").addEventListener("click", (e) => {
  if (e.target.tagName === "DIV") {
    return;
  }

  console.log(e.target.innerText);
});

์กฐ๊ธˆ ์›์‹œ์ ์ด์ง€๋งŒ target์˜ tagName์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

document.querySelector(".container").addEventListener("click", (e) => {
  // if (e.target.tagName === "DIV") {
  //   return;
  // }

  console.log(e.target.closest("li").innerText);
});

ํ˜น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด element์˜ closest ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. closest ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœ ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์ธ์ž๋กœ ๋ฐ›์€ ์…€๋ ‰ํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

Element์˜ closest() ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ CSS ์„ ํƒ์ž์™€ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€, ์ž๊ธฐ ์ž์‹ ์„ ํฌํ•จํ•ด ์œ„์ชฝ(๋ถ€๋ชจ ๋ฐฉํ–ฅ, ๋ฌธ์„œ ๋ฃจํŠธ๊นŒ์ง€)์œผ๋กœ ๋ฌธ์„œ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.

ํ›„๊ธฐ

์บก์ณ๋ง๋„ ์ •๋ฆฌํ•˜๊ธด ํ–ˆ๋Š”๋ฐ ์บก์ณ๋ง์„ ์–ด๋–ป๊ฒŒ ์จ๋จน์–ด์•ผ ํ• ์ง€ ๊ฐ์ด ์•ˆ ์˜จ๋‹ค... ๐Ÿ˜

์ฐธ๊ณ ๋กœ ๋ชจ๋“  ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„๋ธ”๋ง๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. focus์ฒ˜๋Ÿผ ๋ฒ„๋ธ”๋ง์ด ์•ˆ ๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ๋“œ๋ฌผ๊ฒŒ ์žˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ๊ฑธ์–ด๊ฐ€๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
post-custom-banner

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