Event

๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด html ๋ฌธ์„œ๋Š” ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์—ฌ์žˆ๋‹ค. div๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, div๊ฐ€ ์ด๋ฒคํŠธ์˜ ์‹œ๋ฐœ์ (The Ultimate Cause)์ด๋‹ค.

๋งŒ์•ฝ, div์˜ ๋ถ€๋ชจ๋“ค์—๊ฒŒ๋„ click event๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ๋“ค๋„ ๋‹ค๊ฐ™์ด ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค. (div์˜ ๋ถ€๋ชจ๋“ค์—๊ฒŒ๋„ click event๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ฌด ์ƒ๊ด€์—†๋Š” ๋ฌธ์ œ์ด๋‹ค)

Event Flow

Event Bubblling (์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง)

  • ํŠน์ • ํ™”๋ฉด ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ๋“ค๋กœ ์ „๋‹ฌ๋˜์–ด ๊ฐ€๋Š” ํŠน์„ฑ

Event Capture (์ด๋ฒคํŠธ ์บก์ณ)

  • Event Bubblling๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ์ง„ํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ์ „๋‹ฌ ๋ฐฉ์‹
  • ํด๋ฆญํ•œ ๊ฒƒ์€ ํ•˜์œ„์— ์žˆ๋Š” ์ž์‹์š”์†Œ์ด์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ์ผ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ์š”์†Œ์—์„œ ์ž์‹์š”์†Œ์˜ ์ˆœ์„œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰ ๋˜๋Š” ๊ฒƒ

Target phase

  • ์ด๋ฒคํŠธ์˜ ์ง„์งœ target, ์ด๋ฒคํŠธ์˜ ๋‹น์‚ฌ์ž๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ

Current Target / Target

  • Current Target : ์ด๋ฒคํŠธ์˜ ์ง„์งœ ์ฃผ์ธ
  • Target : ์ด๋ฒคํŠธ์˜ ์‹œ๋ฐœ์ 

Target phase๋งŒ์„ ๋ˆŒ๋ €์„ ๋ฟ์ธ๋ฐ, capture์™€ bubble์ด ์ค‘๋ณต์œผ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” target๊ณผ currentTarget์ด ๋‹ค๋ฅด๊ณ , ์ƒ์œ„ ์š”์†Œ์—์„œ๋„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” bubble์ด ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.

EventTarget.addEventListener()

  • ๊ธฐ๋ณธ๊ฐ’์€ bubble์ด์ง€๋งŒ, addEventListener()์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ž๋กœ ture๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด capture๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
target.addEventListener(type, listener[, useCapture]);

์ด๋ฒคํŠธ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ

e.stopPropagation()

  • ์ด๋ฒคํŠธ ์บก์ฒ˜๋ง๊ณผ ๋ฒ„๋ธ”๋ง์— ์žˆ์–ด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ

e.preventDefault()

  • ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด๋ฒคํŠธ์˜ ์ „ํŒŒ๋ฅผ ๋ง‰์ง€์•Š๊ณ  ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•จ

Event Delegation (์ด๋ฒคํŠธ ์œ„์ž„)

  • ํ•˜์œ„ ์š”์†Œ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ณ  ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„ ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹
<h1>To Do List</h1>
    <ul class="todolist">
      <li>
        <input type="checkbox" id="todo1">
        <label for="todo1">์ฑ…์ฝ๊ธฐ</label>
      </li>
      <li>
        <input type="checkbox" id="todo2">
        <label for="todo2">์šด๋™ํ•˜๊ธฐ</label>
      </li>
      <li>
        <input type="checkbox" id="todo3">
        <label for="todo3">๊ณต๋ถ€ํ•˜๊ธฐ</label>
      </li>
    </ul>
// javascript
const checkboxs = document.querySelectorAll("input");

checkboxs.forEach(function (checkbox) {
  checkbox.addEventListener("click", function (e) {
    alert("Done ๐ŸŽ‰");
  });
});

๋ชจ๋“  input์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ค˜์„œ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด alert๊ฐ€ ๋œจ๊ฒŒ๋” ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์ดํ›„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋˜‘๊ฐ™์ด ํด๋ฆญํ•ด๋ณด์•˜๋‹ค.

const todolist = document.querySelector(".todolist");
const li = document.createElement("li");
const input = document.createElement("input");
const label = document.createElement("label");
const innerText = document.createTextNode("์ผ๊ธฐ์“ฐ๊ธฐ");

input.setAttribute("type", "checkbox");
input.setAttribute("id", "todo4");
label.setAttribute("for", "todo4");
label.appendChild(innerText);
li.appendChild(input);
li.appendChild(label);
todolist.appendChild(li);

์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋ฆฌ์ŠคํŠธ์—๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฆฌ์ŠคํŠธ์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ ์ด๋ฒคํŠธ ์œ„์ž„ ์ด๋‹ค. input์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ input์˜ ์ƒ์œ„ ์š”์†Œ์ธ ul ํƒœ๊ทธ์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์„œ, ํ•˜์œ„์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ฒŒ ํ•œ๋‹ค.

const todolist = document.querySelector(".todolist");
todolist.addEventListener("click", function (e) {
  alert("Done ๐ŸŽ‰");
});

๊น€๋ฒ„๊ทธ์˜ DOM ์ด๋ฒคํŠธ ํ”Œ๋กœ์šฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์บกํ‹ดํŒ๊ต์˜ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง, ์ด๋ฒคํŠธ ์บก์ฒ˜ ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ ์œ„์ž„๊นŒ์ง€