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 ์ด๋ฒคํธ ํ๋ก์ฐ ์๋ฒฝํ๊ฒ ์ ๋ฆฌํด๋๋ฆฝ๋๋ค.
์บกํดํ๊ต์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง, ์ด๋ฒคํธ ์บก์ฒ ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ ์์๊น์ง