...

๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ ๋?
์ด๋ฒคํธ(event)๋ ์ด๋ค ์ฌ๊ฑด์ ์๋ฏธํ๋ค.
๋ธ๋ผ์ฐ์ ์์์ ์ด๋ฒคํธ๋ ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ์ ๋, ์นํ์ด์ง๊ฐ ๋ก๋๋์์ ๋์ ๊ฐ์ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ DOM ์์์ ๊ด๋ จ์ด ์๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ์ ๋ง๋ ๋ฐ์์ ํ์ฌ์ผ ํ๋ค. ์ด๋ฅผ ์ํด ์ด๋ฒคํธ๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์์ ์ฐ๊ฒฐ๋๋ฉฐ ๊ทธ ํจ์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์๋ ์คํ๋์ง ์๋ค๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋๋ฉด ์คํ๋๋ค. ์ด ํจ์๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ผ ํ๋ฉฐ ์ด๋ฒคํธ์ ๋์ํ๋ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ์ ํ๋ค.

์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ์ ์ข ๋ฅ
์ค๋ฌด์ ์์ฃผ ์ฐ์ด๋ ๋ํ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ๋ฅผ ์๊ฐํ๋ค.
UI Event
Event | Description |
load | ์นํ์ด์ง๋ ์คํฌ๋ฆฝํธ์ ๋ก๋๊ฐ ์๋ฃ๋์์ ๋ |
unload | ์นํ์ด์ง๊ฐ ์ธ๋ก๋๋ ๋(์ฃผ๋ก ์๋ก์ด ํ์ด์ง๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ) |
error | ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ ๋ง๋ฌ๊ฑฐ๋ ์์ฒญํ ์์์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ |
resize | ๋ธ๋ผ์ฐ์ ์ฐฝ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ ๋ |
scroll | ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์์๋๋ก ์คํฌ๋กคํ ๋ |
select | ํ ์คํธ๋ฅผ ์ ํํ์ ๋ |
Keyboard Event
Event | Description |
keydown | ํค๋ฅผ ๋๋ฅด๊ณ ์์ ๋ |
keyup | ๋๋ฅด๊ณ ์๋ ํค๋ฅผ ๋ ๋ |
keypress | ํค๋ฅผ ๋๋ฅด๊ณ ๋์ ๋ |
keyCode | ํค ์ฝ๋๊ฐ. https://blog.lael.be/post/75 |
Mouse Event
Event | Description |
click | ๋ง์ฐ์ค ๋ฒํผ์ ํด๋ฆญํ์ ๋ |
dbclick | ๋ง์ฐ์ค ๋ฒํผ์ ๋๋ธ ํด๋ฆญํ์ ๋ |
mousedown | ๋ง์ฐ์ค ๋ฒํผ์ ๋๋ฅด๊ณ ์์ ๋ |
mouseup | ๋๋ฅด๊ณ ์๋ ๋ง์ฐ์ค ๋ฒํผ์ ๋ ๋ |
mousemove | ๋ง์ฐ์ค๋ฅผ ์์ง์ผ ๋ (ํฐ์น์คํฌ๋ฆฐ์์ ๋์ํ์ง ์๋๋ค) |
mouseover | ๋ง์ฐ์ค๋ฅผ ์์ ์๋ก ์์ง์์ ๋ (ํฐ์น์คํฌ๋ฆฐ์์ ๋์ํ์ง ์๋๋ค) |
mouseout | ๋ง์ฐ์ค๋ฅผ ์์ ๋ฐ์ผ๋ก ์์ง์์ ๋ (ํฐ์น์คํฌ๋ฆฐ์์ ๋์ํ์ง ์๋๋ค) |
mouserenter | ํด๋น ์์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ์ฌ๋ ค๋ค๋์์๋ |
mouseleave | ํด๋น ์์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ๋นผ๋ผ๋ |
Focus Event
Event | Description |
focus/focusin | ์์๊ฐ ํฌ์ปค์ค๋ฅผ ์ป์์ ๋ |
blur/foucusout | ์์๊ฐ ํฌ์ปค์ค๋ฅผ ์์์ ๋ |
Form Event
Event | Description |
input | input ๋๋ textarea ์์์ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ contenteditable ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ์ง ์์์ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ |
change | select box, checkbox, radio button์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ |
submit | form์ submitํ ๋ (๋ฒํผ ๋๋ ํค) |
reset | reset ๋ฒํผ์ ํด๋ฆญํ ๋ (์ต๊ทผ์๋ ์ฌ์ฉ ์ํจ) |
Clipboard Event
Event | Description |
cut | ์ฝํ ์ธ ๋ฅผ ์๋ผ๋ด๊ธฐํ ๋ |
copy | ์ฝํ ์ธ ๋ฅผ ๋ณต์ฌํ ๋ |
paste | ์ฝํ ์ธ ๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐํ ๋ |
์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ๋ก ๋ฐฉ๋ฒ
โ
inline ๋ฐฉ์
์ธ๋ผ์ธ ๋ฐฉ์์ ์ด๋ฒคํธ๋ฅผ ์ด๋ฒคํธ ๋์์ ํ๊ทธ ์์ฑ์ผ๋ก ์ง์ ํ๋ ๊ฒ์ด๋ค.
๋ค์์ ๋ฒํผ์ ํด๋ฆญํ์ ๋ Hello world๋ฅผ ๊ฒฝ๊ณ ์ฐฝ์ผ๋ก ์ถ๋ ฅํ๋ค.
<input type="button" onclick="alert('Hello world');" value="button" />
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์์ ํ์๋กํ๋ ๊ฒฝ์ฐ this๋ฅผ ํตํด์ ์ฐธ์กฐํ ์ ์๋ค.
<input type="button" onclick="alert('Hello world, ' + this.value);" value="button" />
// >> Hello world button
scriptํญ์์ ํจ์๋ฅผ ๋ง๋ค๊ณ , ํ๊ทธ์ ์ง์ ํ๋ ๋ฐฉ์๋ ์๋ค.
<button onclick="myHandler1(); myHandler2();">Click me</button>
<script>
function myHandler1() {
alert('myHandler1');
}
function myHandler2() {
alert('myHandler2');
}
</script>
ํ๋กํผํฐ ๋ฐฉ์
ํ๋กํผํฐ ๋ฆฌ์ค๋ ๋ฐฉ์์ ์ด๋ฒคํธ ๋์์ ํด๋นํ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ์์ด๋ค.
์ธ๋ผ์ธ ๋ฐฉ์์ ๋นํด์ HTML๊ณผ JavaScript๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค๋ ์ ์์ ์ ํธ๋๋ ๋ฐฉ์์ด์ง๋ง ๋ค์์ ๋ฐฐ์ธ addEventListener ๋ฐฉ์์ ์ถ์ฒํ๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ ๋ฐฉ์์ ์ด๋ฒคํธ์ ์ค์ง ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ง์ ๋ฐ์ธ๋ฉํ ์ ์๋ค
<button class="btn">Click me</button>
<script>
const btn = document.querySelector('.btn');
// ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ ๋ฐฉ์์ ์ด๋ฒคํธ์ ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ง์ ๋ฐ์ธ๋ฉํ ์ ์๋ค
// ์ฒซ๋ฒ์งธ ๋ฐ์ธ๋ฉ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ => ์คํ๋์ง ์๋๋ค.
btn.onclick = function() {
alert('โ Button clicked 1');
};
// ๋๋ฒ์งธ ๋ฐ์ธ๋ฉ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ
btn.onclick = function() {
alert('โ Button clicked 2'); // << ์คํ๊ฒฐ๊ณผ
};
</script>
addEventListener ๋ฐฉ์
addEventListener ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋์ DOM ์์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์(์ด๋ฒคํธ ํธ๋ค๋ฌ)๋ฅผ ์ง์ ํ๋ค.

addEventListener ํจ์ ๋ฐฉ์์ ์ด์ ๋ฐฉ์์ ๋นํด ์๋์ ๊ฐ์ด ๋ณด๋ค ๋์ ์ฅ์ ์ ๊ฐ๋๋ค.
- ํ๋์ ์ด๋ฒคํธ์ ๋ํด ํ๋ ์ด์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- ์บก์ฒ๋ง๊ณผ ๋ฒ๋ธ๋ง์ ์ง์ํ๋ค.
- HTML ์์๋ฟ๋ง์๋๋ผ ๋ชจ๋ DOM ์์(HTML, XML, SVG)์ ๋ํด ๋์ํ๋ค. ๋ธ๋ผ์ฐ์ ๋ ์น ๋ฌธ์(HTML, XML, SVG)๋ฅผ ๋ก๋ํ ํ, ํ์ฑํ์ฌ DOM์ ์์ฑํ๋ค.
<input type="button" id="target" value="button" />
<script>
var t = document.getElementById('target');
t.addEventListener('click', function(event){
alert('Hello world, '+event.target.value);
});
</script>
<input type="button" id="target1" value="button1" />
<input type="button" id="target2" value="button2" />
<script>
var t1 = document.getElementById('target1');
var t2 = document.getElementById('target2');
function btn_listener(event){
switch(event.target.id){
case 'target1':
alert(1);
break;
case 'target2':
alert(2);
break;
}
}
t1.addEventListener('click', btn_listener); // btn_listener()๊ฐ ์๋๋ค.
t2.addEventListener('click', "btn_listener()"); // btn_listener()๋ฅผ ์ฐ๋ ค๋ฉด ๋ฌธ์์ด๋ก ๊ฐ์ผ๋ค.
</script>
์ ์ฝ๋์์ ์ด๋ฒคํธ๋ฆฌ์ค๋ ๋๋ฒ์งธ ์ธ์๋ก ํจ์๋ฅผ ๋ฃ์ด์ฃผ๋๋ฐ,โaddEventListener('click', btn_listener)โ๋ณด๋ค์ํผbtn_listener()๊ฐ ์๋๋ผ ๊ทธ๋ฅbtn_listener๋ค.
ํจ์์ธ๋ฐ ()๋ฅผ ์๋ถ์ฌ์ฃผ๋ฉด ์ฐ๋ ์ถ์๋ฐ,btn_listener()๋ก ์ฐ๋ฉด ํจ์์์ฒด๋ฅผ ์ฐ๋๊ฒ ์๋๋ผ ๋ฆฌํด๊ฐ์ ๋ฐ๊ฒ๋๋ค.
๋ง์ผbtn_listener()๋ผ๊ณ ์ฐ๊ณ ์ถ๋ค๋ฉด "btn_listener()" ๋ฌธ์์ด๋ก ๊ฐ์ธ๋ฉด ๋๋ค. ๋ฌธ์์ด๋ก ๊ฐ์ธ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฒด๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์น eval()ํจ์ ์ฒ๋ผ ๋ง์ด๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์ this ์ด์ฉ
โ
์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐฉ์
์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐฉ์์ ๊ฒฝ์ฐ, ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋๋ฏ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์ this๋ ์ ์ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
<button onclick="foo()">Button</button>
<script>
function foo () {
console.log(this); // window
}
</script>
โ
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ ๋ฐฉ์
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ ๋ฐฉ์์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋ฉ์๋์ด๋ฏ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์ this๋ ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉ๋ ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ด๊ฒ์ ์ด๋ฒคํธ ๊ฐ์ฒด์ currentTarget ํ๋กํผํฐ์ ๊ฐ๋ค.
<button class="btn">Button</button>
<script>
const btn = document.querySelector('.btn');
btn.onclick = function (e) {
console.log(this); // <button id="btn">Button</button>
console.log(e.currentTarget); // <button id="btn">Button</button>
console.log(this === e.currentTarget); // true
};
</script>
โ
addEventListener ๋ฐฉ์
addEventListener ๋ฉ์๋์์ ์ง์ ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ฝ๋ฐฑ ํจ์์ด์ง๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์ this๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฐ์ธ๋ฉ๋ ์์(currentTarget)๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ด๊ฒ์ ์ด๋ฒคํธ ๊ฐ์ฒด์ currentTarget ํ๋กํผํฐ์ ๊ฐ๋ค.
<button class="btn">Button</button>
<script>
const btn = document.querySelector('.btn');
btn.addEventListener('click', function (e) {
console.log(this); // <button id="btn">Button</button>
console.log(e.currentTarget); // <button id="btn">Button</button>
console.log(this === e.currentTarget); // true
});
</script>
Event ๊ฐ์ฒด
event ๊ฐ์ฒด๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์์ ๋ฐ์ํ ์ด๋ฒคํธ์ ๋ํ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด event ๊ฐ์ฒด๋ ๋์ ์ผ๋ก ์์ฑ๋๋ฉฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ธ์๋ก ์ ๋ฌ๋๋ค.
<!DOCTYPE html>
<html>
<body>
<p>ํด๋ฆญํ์ธ์. ํด๋ฆญํ ๊ณณ์ ์ขํ๊ฐ ํ์๋ฉ๋๋ค.</p>
<em class="message"></em>
<script>
function showCoords(e) { // e: event object
const msg = document.querySelector('.message');
msg.innerHTML =
'clientX value: ' + e.clientX + '<br>' +
'clientY value: ' + e.clientY;
}
addEventListener('click', showCoords); // ์ฐธ์กฐํ๋๊ฒ ์์ผ๋ฉด ๊ธฐ๋ณธ window ์ ์ญ ๊ฐ์ฒด
</script>
</body>
</html>

์์ ๊ฐ์ด event ๊ฐ์ฒด๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์๋ฌต์ ์ผ๋ก ์ ๋ฌ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ์ธํ ๋, event ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ฌ์ผ ํ๋ค.
์์ ์์ e๋ผ๋ ์ด๋ฆ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ์์ผ๋ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ๋ ์๊ด์๋ค.
Event ๊ฐ์ฒด ์์ฑ ์ข ๋ฅ
๐ Event.target
์ค์ ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ฒ๋ธ๋ง์ ์ธํด์ ์ฉ๋ฑ๋ง๋ ๋ค๋ฅธ ํ๊ฒ์ด ์ธ์ ๋ ์ ์๋ค.
โ
๐ Event.currentTarget
์ฝ๋์์ ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉ๋ DOM ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฆ, addEventListener ์์ ๊ธฐ์ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์ ๋ด์์ currentTarget๊ณผ this๋ ์ธ์ ๋ ์ผ์นํ๋ค.
โ
์๋ฅผ๋ค์ด ์๋ ์ฝ๋์์ div๋ฅผ ์ด๋ฒคํธ๋ฆฌ์ค๋๋ก ๋ฑ๋กํ๋ค. ๊ทธ๋ฐ๋ฐ div์์ button์ด ์๋๋ฐ, div์์ญ์ clickํ๋ button์์ญ์ clickํ๋ ๋๊ฐ์ด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค.
- this : div
- e.target : button
- e.currentTarget : div
<div>
<button>๋ฐฐ๊ฒฝ์ ๋ณ๊ฒฝ</button>
</div>
document.querySelector('div').addEventListener('click', function() {
// this: ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉ๋ DOM ์์(div ์์)
console.log('this: ', this);
// target: ์ค์ ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์(button ์์ ๋๋ div ์์)
console.log('e.target:', e.target);
// currentTarget: ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉ๋ DOM ์์(div ์์)
console.log('e.currentTarget: ', e.currentTarget);
});
๐ Event.type
๋ฐ์ํ ์ด๋ฒคํธ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
โ
๐ Event.cancelable
์์์ ๊ธฐ๋ณธ ๋์์ ์ทจ์์ํฌ ์ ์๋์ง ์ฌ๋ถ(true/false)๋ฅผ ๋ํ๋ธ๋ค.
โ
๐ Event.eventPhase
์ด๋ฒคํธ ํ๋ฆ(event flow) ์์์ ์ด๋ ๋จ๊ณ(event phase)์ ์๋์ง๋ฅผ ๋ฐํํ๋ค.
๋ฐํ๊ฐ | ์๋ฏธ |
0 | ์ด๋ฒคํธ ์์ |
1 | ์บก์ณ๋ง ๋จ๊ณ |
2 | ํ๊น |
3 | ๋ฒ๋ธ๋ง ๋จ๊ณ |
โ
๐ Event Delegation (์ด๋ฒคํธ ์์)โ
โ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ li ์์๊ฐ ํด๋ฆญ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, li ์์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๋ฉด ์ด 6๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ์ผ ํ๋ค.
<ul id="post-list">
<li id="post-1">Item 1</li>
<li id="post-2">Item 2</li>
<li id="post-3">Item 3</li>
<li id="post-4">Item 4</li>
<li id="post-5">Item 5</li>
<li id="post-6">Item 6</li>
</ul>
function printId() {
console.log(this.id);
}
document.querySelector('#post-1').addEventListener('click', printId);
document.querySelector('#post-2').addEventListener('click', printId);
document.querySelector('#post-3').addEventListener('click', printId);
document.querySelector('#post-4').addEventListener('click', printId);
document.querySelector('#post-5').addEventListener('click', printId);
document.querySelector('#post-6').addEventListener('click', printId);
๋ง์ผ li ์์๊ฐ 100๊ฐ๋ผ๋ฉด 100๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ์ผ ํ๋ค.
์ด๋ ์คํ ์๋ ์ ํ์ ์์ธ์ด ๋ ๋ฟ ์๋๋ผ ์ฝ๋ ๋ํ ๋งค์ฐ ๊ธธ์ด์ง๋ฉฐ ์์ฑ ๋ํ ๋ถํธํ๋ค. โ๊ทธ๋ฆฌ๊ณ ๋์ ์ผ๋ก li ์์๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ, ์์ง ์ถ๊ฐ๋์ง ์์ ์์๋ DOM์ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์๋ค.
โ
์ด๋ฌํ ๊ฒฝ์ฐ ์ด๋ฒคํธ ์์(Event Delegation)์ ์ฌ์ฉํ๋ค.
์ด๋ฒคํธ ์์์ ๋ค์์ ์์ ์์์ ๊ฐ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๋์ ํ๋์ ๋ถ๋ชจ ์์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
โ์์ ๊ฒฝ์ฐ 6๊ฐ์ ์์ ์์์ ๊ฐ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ ๋์ ๋ถ๋ชจ ์์(ul#post-list)์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ด๋ค. ๋ํ DOM ํธ๋ฆฌ์ ์๋ก์ด li ์์๋ฅผ ์ถ๊ฐํ๋๋ผ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ ๋ถ๋ชจ ์์์ธ ul ์์์ ์์๋์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์์์ ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋ฌ๋ฅผ ๋ค์ ๋ฐ์ธ๋ฉํ ํ์๊ฐ ์๋ค. โ์ด๋ ์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํ๋ฆ์ ์ํด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์์ ๋ถ๋ชจ ์์์๋ ์ํฅ(๋ฒ๋ธ๋ง)์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
์ค์ ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์๋ฅผ ์์๋ด๊ธฐ ์ํด์๋ Event.target์ ์ฌ์ฉํ๋ค.
const msg = document.querySelector('.msg');
const list = document.querySelector('ul#post-list')
list.addEventListener('click', function (e) {
// ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์
console.log('[target]: ' + e.target);
// ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์์ nodeName
console.log('[target.nodeName]: ' + e.target.nodeName);
// li ์์ ์ด์ธ์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ ๋์ํ์ง ์๋๋ค.
if (e.target && e.target.nodeName === 'LI') {
msg.innerHTML = 'li#' + e.target.id + ' was clicked!';
}
});

# ์ฐธ๊ณ ์๋ฃ
https://opentutorials.org/course/1375/6759
https://poiemaweb.com/js-event
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.