wa_ter_ve
Javascript 2 DOM ๋ณธ๋ฌธ
๐ DOM (Document Object Model)
; ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ
์น ๋ฌธ์๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๊ฒ ๊ฐ์ฒด๋ก ๊ตฌ์กฐํํ์ฌ ํํํ๋ ๋ฐฉ์.
๋ฌธ์์ ์์๋ค์ ๋
ธ๋๊ฐ ๋์ด ๋ถ๋ชจ-์์ ๊ด๊ณ์ ๊ณ์ธต์ ๊ตฌ์กฐ.
์ด ๊ฐ์ฒด๋ค์ Javascript๋ฅผ ํตํด ์์ , ์ญ์ , ์ถ๊ฐ ๋ฑ ๋์ ์ผ๋ก ์กฐ์ ๊ฐ๋ฅ.
๐ต ๋๊ธฐ์ ์ฒ๋ฆฌ ๋ชจ๋ธ (Synchronous processing model)
- ์์ฐจ์ ์ผ๋ก ์คํ (์ง๋ ฌ)
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด๋ก ํ๋์ ์์
๋ง ์ํ ๊ฐ๋ฅ.
์
๋ ฅํ ์ฝ๋๋๋ก ์์ฐจ์ ์ผ๋ก ๋์ํ๋ ๋ฐฉ์์ ๋๊ธฐ์ ์ฒ๋ฆฌ๋ผ๊ณ ํจ.
์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ฉด ์๋ต์ด ์ฌ ๋๊น์ง ๋ค๋ฅธ ์์
์ ํ์ง ๋ชป ํ๊ณ ๋๊ธฐํด์ผ ํจ.
๊ทธ๋งํผ ๊ธฐ๋ค๋ฆผ์ด ๊ธธ์ด์ง๊ณ ํจ์จ์ด ๋จ์ด์ง๊ธฐ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น ์ ์์.
ex.) ์๋ฆฌ๋ฅผ ํ๋ค๊ฐ ์ฐธ๊ธฐ๋ฆ์ด ํ์ํด์ง.
โ ์๋ฆฌํ๋ ์ฌ๋์ด ์ง์ ์ฐธ๊ธฐ๋ฆ์ ์ฌ์ค๊ณ
โ ๋ค์ ๋ง์ ์๋ฆฌ๋ฅผ ์๋ฃํ ๋ค์ ๋ค๋ฅธ ์๋ฆฌ๋ฅผ ์๋ก ์์.
๐ด ๋น๋๊ธฐ์ ์ฒ๋ฆฌ ๋ชจ๋ธ (Asynchronous processing model)
- ๋น์์ฐจ์ ์ผ๋ก ์คํ (๋ณ๋ ฌ)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด์ง๋ง, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋ฉํฐํ์คํน์ฒ๋ผ ์์
์ ์ํ.
์์
์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์
์ ์คํํ์ง ์๊ณ , ๋ฉ์ธ ์ค๋ ๋๊ฐ ์์
์ ๋ค๋ฅธ ๊ณณ์ ๋งก๊ธฐ๊ณ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ๋ค์ ๋ฐ์. ์ด๋ก์จ ๋์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฌ๋ฌ ์์
์ ํจ์ธ์ ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ.
์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ์ค์๊ฐ ์ํธ์์ฉ์ด ์ค์ํ ์์
์์ ๋ง์ด ์ฌ์ฉ.
ex.) ์๋ฆฌ๋ฅผ ํ๋ค๊ฐ ์ฐธ๊ธฐ๋ฆ์ด ํ์ํด์ง.
โ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ฐธ๊ธฐ๋ฆ ์ฌ๋ค์ฃผ๊ธธ ์์ฒญํจ. ์ฐธ๊ธฐ๋ฆ์ด ์ฌ ๋์ ๋ค๋ฅธ ์๋ฆฌ๋ฅผ ํ๋ฉด์ ๊ธฐ๋ค๋ฆผ.
โ ๊ทธ๋ฆฌ๊ณ ์ฐธ๊ธฐ๋ฆ์ด ์ค๋ฉด ๋ค์ ์๋์ ์๋ฆฌ๋ฅผ ๋ง์ ์์ฑ.
๐ญ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ๋ฉํฐ ํ์คํน์ด ๊ฐ๋ฅํ ๊ฑธ๊น?
=> ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์คํ์ ์ฑ๊ธ์ค๋ ๋์ง๋ง, Web APIs๋ ๋ฉํฐ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ.
- Web APIs : ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ ๊ธฐ๋ฅ. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์น์์ ๋ค์ํ ์์ ์ ํ ์ ์๊ฒ๋ ๋๋ ์ธํฐํ์ด์ค. (Html ๋ฌธ์ ์ ์ด, ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ ์ถ๋ ฅ, ํ์ด๋จธ, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ์ ์์ ์ ์ํ)
- โก๏ธ Web APIs๋ ๊ฐ API๋ง๋ค ์ค๋ ๋๊ฐ ํ ๋น๋์ด ์๊ณ ์ด๊ฒ๋ค์ด ๋ชจ์ฌ ๋ฉํฐ ์ค๋ ๋ ํ์ฑ.
API โ
- ์๋ก ๋ค๋ฅธ ์ํํธ์จ์ด๋ ์์คํ ์ด ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ์ํธ์์ฉ์ ๋๋ ์ค๊ฐ ๋งค๊ฐ์ฒด.
์ด๋ ๋ฏ ๋ธ๋ผ์ฐ์ ๋ ๋ฉํฐ ์ค๋ ๋๋ก ์๋ํ๊ธฐ ๋๋ฌธ์,
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฉ์ธ ์ค๋ ๋์ Web APIs์ ์์
์ ๋์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ.
โก๏ธ ๋น๋๊ธฐ ํจ์๋ฅผ ํตํด ์ฑ๋ฅ ํฅ์ ํจ๊ณผ๋ฅผ ๋๋ฆด ์ ์์.
โ๏ธ ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ๋์์ฑ(Concurrency)
์ฌ๋ฌ ์์
์ ์ฒ๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋ ์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์ ๋์์ฑ(Concurrency)์ด๋ผ๊ณ ํ๋ฉฐ,
์ด๊ฒ์ ๋๋ ๊ฒ์ ์ด๋ฒคํธ ๋ฃจํ(Event Loop)๋ผ๊ณ ํจ.
โ Call Stack(ํธ์ถ ์คํ)
- ํจ์๊ฐ ํธ์ถ๋๋ฉด ์์ฒญ๋ ์์
๋ค์ด Call Stack์ ์์ด๊ณ ์์๋๋ก ์คํ๋จ.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋์ Call Stack์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ํ๋์ ์์
์ด ์ข
๋ฃ๋๊ธฐ ์ด์ ์ ๋ค๋ฅธ ์์
์ ์คํ ๋ถ๊ฐ๋ฅ.
โ Heap
- ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด ๋ฐ ๋ฐ์ดํฐ ์ ์ฅ์.
โ Event Queue(Task Queue)
- ๋น๋๊ธฐ ์์
์๋ฃ ์ ์คํ๋ ํจ์๋ค์ ๋๊ธฐ์ค.
DOM ์ด๋ฒคํธ, ๋น๋๊ธฐ์ ์ฝ๋ฐฑ ํจ์, ๋น๋๊ธฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ, ํ์ด๋จธ ํจ์(setTimeout(), setInterval()), HTTP ์์ฒญ(fetch(), XMLHttpRequest)
๋ฑ์ ์์
๋ค์ด ์ด๋ฒคํธ ํ์ ๋ค์ด๊ฐ๋ค๊ฐ โ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ์์ฐจ์ ์ผ๋ก Call Stack์ผ๋ก ์ด๋๋ ํ ์คํ๋จ.
โ Event Loop(์ด๋ฒคํธ ๋ฃจํ)
- Call Stack ๋ฐ Event Queue์ ์์
์ด ์๋์ง ๋ฐ๋ณตํ์ฌ ํ์ธ.
Call Stack์ด ๋น์ด์๊ฒ ๋๋ฉด Event Queue์ ์์
๋ค์ ์ด๋์ํด.
์ด ๊ณผ์ ๋ค์ ๊ฑฐ์ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ๋ฉด์๋ ๋๊ธฐ ์ฝ๋์ ์กฐํ๋ฅผ ์ด๋ฃธ.
+ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์
(Garbage Collection)์ ํตํด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌ.
โ๏ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ 3๊ฐ์ง ๋ฐฉ์
โ ์ฝ๋ฐฑ ํจ์
- ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋๋ฉด, ํจ์๋ฅผ ๋ฐ์์ ์ถ๋ ฅํ๋ ํจ์.
console.log(โ์ฒซ๋ฒ์งธ ์คํโ);
// 1์ด ํ์ ์คํ
setTimeout(() => {
console.log(โ๋๋ฒ์งธ ์คํโ);
}, 1000);
console.log(โ์ธ๋ฒ์งธ ์คํโ);
์ฒซ๋ฒ์งธ ์คํ
์ธ๋ฒ์งธ ์คํ
๋๋ฒ์งธ ์คํ // -> 1์ด ํ ์คํ๋์ด, ์ธ๋ฒ์งธ ๋ณด๋ค ๋ฆ๊ฒ ์ถ๋ ฅ๋จ.
โก Promise
- ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋๋ฉด ์ฑ๊ณต/์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด.
- ์ฑ๊ณตํ๋ฉด resolve / ์คํจํ๋ฉด reject ๋ก ๊ฒฐ๊ณผ ์ฒ๋ฆฌ.
- then
- then ๋ฉ์๋๋ Promise๊ฐ ์ฑ๊ณต(resolve)ํ์ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ์.
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve(โ์ฑ๊ณตโ), 1000);
});
promise.then(result => {
console.log(result);
});
// โ์ฑ๊ณตโ ์ถ๋ ฅ
- catch
- catch ๋ฉ์๋๋ Promise๊ฐ ์คํจ(reject)ํ์ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ์.
- catch๋ then ๋ค์ ์ฒด์ด๋์ผ๋ก ๋ถ์ฌ์ ์ฌ์ฉ.
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(โ์คํจโ), 1000);
});
promise.then(result => {
console.log(result);
}).catch(error => {
console.error(error);
});
โข Async / Await
- ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ญํ .
- Promise๋ฅผ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์.
await๋ฅผ ํตํด promise๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ.
async function Function() { // async ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ํจ์ ์ ์ธ
let promise = new Promise((resolve, reject) => { // ์๋ก์ด Promise ์์ฑ
setTimeout(() => resolve("์๋ฃ!"), 1000); // 1์ด ํ์ "์๋ฃ!"๋ก resolve
});
let result = await promise; // promise๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
alert(result); // promise๊ฐ resolve๋๋ฉด "์๋ฃ!"๋ผ๋ ๊ฒฐ๊ณผ๊ฐ result์ ์ ์ฅ๋๊ณ , alert๋ก ํ์
}
Function(); // ๋น๋๊ธฐ ํจ์ ํธ์ถ
Promise ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์์ง์ด ๋ค๋ฅธ ์ผ(๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ)์ ํ๊ธฐ ๋๋ฌธ์ CPU ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋์ง ์์ผ๋ฉฐ, ๋๊ธฐ์ ์ฒ๋ฆฌ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์๋ ๊ฒ.
๐น๏ธ JavaScript๊ฐ DOM์ ์กฐ์ํ๋ ๋ฐฉ๋ฒ
๐น DOM ์์ ์ ํ
โข document.getElementById() - ํน์ ID๋ฅผ ๊ฐ์ง ์์๋ฅผ ์ ํ
โข document.querySelector() - css์ ํ์๋ฅผ ์ด์ฉํด ์ ์ผ ๋จผ์ ๋ถํฉํ๋ ์์๋ฅผ ์ ํ
โข document.querySelectorAll() - ๋ถํฉํ๋ ๋ชจ๋ ์์๋ค์ ๋
ธ๋ ๋ฆฌ์คํธ์ ๋ฐํ. (ํด๋์ค๋ช
๋ฐ ํ๊ทธ๋ช
์ผ๋ก ์ ํ)
let elements = document.querySelectorAll('.myClass');
๐น ์ฝํ ์ธ ์์
โข innerHTML - ์์ ์์ HTMl ๊ตฌ์กฐ ์ฝ์
โข textContent - ํ
์คํธ ์์์ ๋ด์ฉ ์์
๐น DOM ์์ ์์ฑ ์ถ๊ฐ ๋ฐ ์์
โข setAttribute() - ์์ฑ ์์
โข getAttribute() - ํน์ ์์ฑ์ ๊ฐ์ ๋ถ๋ฌ์ค๊ธฐ
โข removeAttribute() - ์์ ์ ๊ฑฐ
๐น CSS ์คํ์ผ ๋ณ๊ฒฝ
- style ์์ฑ์ ํตํด ์ธ๋ผ์ธ ์คํ์ผ ์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
element.style.backgroundColor = โblackโ;
๐น DOM ์์ ์์ฑ ๋ฐ ์ถ๊ฐ
โข document.createElement()
- ์๋ก์ด HTML ์์ ์์ฑ
let newDiv = document.createElement(โdivโ);
โข appendChild() - ๋ถ๋ชจ ์์ ์๋ ์๋ก์ด ์์ ์์ ์ถ๊ฐ
document.body.appendChild(newDiv);
โข insertBefore() - ์์ ์์ ์๋ก์ด ์์ ์ถ๊ฐ
๐น DOM ์์ ์ ๊ฑฐ
โข removeChild() - ๋ถ๋ชจ ์์ ์๋์ ์์ ์์๋ฅผ ์ ๊ฑฐ
โข remove() - ์ง์ ํน์ ์์ ์ ๊ฑฐ
๐น ํด๋์ค ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ
โข classList.add() - ํด๋์ค ์ถ๊ฐ
โข classList.remove() - ํด๋์ค ์ ๊ฑฐ
โข classList.toggle() - ํด๋์ค toggle ์์ผ๋ฉด ์ ๊ฑฐํ๊ณ ์์ผ๋ฉด ์ถ๊ฐ.
element.classList.toggle('active');
โ๏ธ ์ด๋ฒคํธ(Event)์ ์ด๋ฒคํธ ์ฒ๋ฆฌ(Event Handling)
- ์ด๋ฒคํธ(Event)
์น ๋ธ๋ผ์ฐ์ ์์ ์ด๋ ํ ๋์์ด ๋ฐ์ํ ๊ฒ.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ(Event Handling)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๋ํด,
์ด๋ฒคํธ ํธ๋ค๋ฌ(Event Handler) or ์ด๋ฒคํธ ๋ฆฌ์ค๋(Event Listener) ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ.
๐ซ ์ด๋ฒคํธ ์ ํ
๋ง์ฐ์ค ์ด๋ฒคํธ
- click : ๋ง์ฐ์ค ํด๋ฆญ
- dblclick : ๋ง์ฐ์ค ๋๋ธ ํด๋ฆญ
- mouseover : ๋ง์ฐ์ค๊ฐ ์์ญ ์์ ๋ค์ด์์ ์
- mouseout : ๋ง์ฐ์ค๊ฐ ์์ญ์ ๋ฒ์ด๋ฌ์ ์
- mousedown : ๋ง์ฐ์ค๋ฅผ ๋๋ ์ ์
- mouseup : ๋ง์ฐ์ค๋ฅผ ๋ผ์์ ์
- mousemove : ๋ง์ฐ์ค๋ฅผ ์์ง์ผ ์
- contextmenu : ๋ง์ฐ์ค ์ฐํด๋ฆญ
ํค๋ณด๋ ์ด๋ฒคํธ
- keydown : ํค๋ณด๋ ํค ๋๋ ์ ์
- keyup : ํค๋ณด๋ ํค ๋ผ์์ ์
- keypress : ํค๋ณด๋ ํค ๋๋ฅธ ์ํ์ผ ์
ํผ ์ด๋ฒคํธ
- submit : submit ๋ฒํผ ๋๋ ์ ์
- reset : reset ๋ฒํผ ๋๋ ์ ์ (์ต๊ทผ์๋ ์ฌ์ฉ X)
- focus : html ์์๊ฐ ํฌ์ปค์ค๋ฅผ ๋ฐ์ ์
- blur : html ์์๊ฐ ํฌ์ปค์ค๋ฅผ ์์ ์
- change : ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ์
- select : input ๋๋ textarea ํ๊ทธ ์์ ํ ์คํธ๋ฅผ ๋๋๊ทธ ํ์ ๋
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Focus์์</title>
</head>
<body>
<input type="text" id="Input" placeholder="^^" />
<script>
let inputBox = document.getElementById("Input");
inputBox.addEventListener("focus", function () {
inputBox.style.backgroundColor = "lightyellow"; // ํฌ์ปค์ค๊ฐ ๋ง์ถฐ์ง๋ฉด ๋ฐฐ๊ฒฝ์ ๋ณ๊ฒฝ
});
inputBox.addEventListener("blur", function () {
inputBox.style.backgroundColor = " "; // ํฌ์ปค์ค๊ฐ ๋ฒ์ด๋๋ฉด ๋ฐฐ๊ฒฝ์ ๋ณต๊ตฌ
});
</script>
</body>
</html>
๋ฌธ์/์๋์ฐ ์ด๋ฒคํธ
- DOMContentLoaded : html ๋ฌธ์ ๋ก๋ ํ DOM ํธ๋ฆฌ๊ฐ ์์ฑ๋์์ ์
- load : ํ์ด์ง ๋ก๋ฉ ์๋ฃ ์
- unload : ํ์ด์ง ์ด๋ ์
- resize : ์์์ ์ฌ์ด์ฆ ๋ณ๊ฒฝ ์
- scroll : ์คํฌ๋กค๋ฐ ์์ง์์ ์
๐ก ์ด๋ฒคํธ ์ ํ(Event Propagation)
- ์ด๋ฒคํธ๋ DOM tree(๋ถ๋ชจ-์์ ์์)๋ฅผ ํตํด ์ ํ๋จ
โ ์บก์ณ๋ง(Capturing)
: ์ต์์ ์์(๋ถ๋ชจ ์์)๋ถํฐ ์์ ์์๋ค์ ๊ฑฐ์ณ ํํท ์์๋ก ์ ํ๋๋ ๋ฐฉ์.
โ ๋ฒ๋ธ๋ง(Bubbling)
: ํ๊น ์์(์์ ์์)์์ ๋จผ์ ์ฒ๋ฆฌ๋๊ณ ๋ถ๋ชจ ์์๋ก ์ ํ๋๋ฉฐ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ ์ต์์ ์์๊น์ง ๋๋ฌํ๋ ๋ฐฉ์.
๐ถ ์ด๋ฒคํธ ํธ๋ค๋ฌ
: ์ด๋ฒคํธ ๋ฐ์ ์ ์คํ๋๋ ํจ์.
- ์ธ๋ผ์ธ ๋ฐฉ์ (= html ๋ด๋ถ์ ์์ฑ์ผ๋ก ํ ๋น)
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋๋ง ๋ฑ๋ก์ด ๊ฐ๋ฅ.
<button onclick="Function">ํด๋ฆญ</button>
<script>
function Function() {
alert("() ํด๋ฆญ ์ด๋ฒคํธ ๋ฐ์ ์ ํจ์ ์คํ");
}
</script>
๐ถ ์ด๋ฒคํธ ๋ฆฌ์ค๋
: addEventListener ๋ฉ์๋๋ฅผ ํตํด ํด๋น ์์์ ์ฐ๊ฒฐํ์ฌ ์คํ๋ ํจ์๋ฅผ ์ ๋ฌ.
- js ์ฝ๋๋ฅผ ํตํด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋น.
- ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ฌ๋ฌ ๊ฐ ๋ฑ๋ก์ด ๊ฐ๋ฅ, HTML ์์ ๋ฟ ์๋๋ผ ๋ชจ๋ DOM ๋
ธ๋์ ๋ฆฌ์ค๋ ๋ฑ๋ก ๊ฐ๋ฅ.
- ์บก์ณ๋ง ๋ฐ ๋ฒ๋ธ๋ง ์ง์.
let Button = document.getElementById('button'); // ๋ฒํผ ์์ ๊ฐ์ ธ์ค๊ธฐ
Button.addEventListener("click", myEvent); // ํด๋ฆญ ์ด๋ฒคํธ ๋ฐ์ ์ myEvent ํจ์ ์คํ
let myEvent = () => {
alert("์ด๊ฒ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์์
๋๋ค.");
}
๐ ์ด๋ฒคํธ ๊ฐ์ฒด
: DOM์์ ์ด๋ฒคํธ ๋ฐ์ ์, ๊ทธ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด.
์ด ์ด๋ฒคํธ ๊ฐ์ฒด๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ก ์ ๋ฌ๋์ด, ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํจ.
- ' event, evt, e '์ ์ด๋ฆ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉ.
- ์ด๋ฒคํธ ํธ๋ค๋ง์ ๋์ฑ ์ธ๋ถ์ ์ผ๋ก ์ ์ด ๊ฐ๋ฅ.
- ๊ธฐ๋ณธ ๋์ ๋ฐ ์ด๋ฒคํธ ์ ํ ๋ฑ ๊ธฐ๋ณธ ๋์๋ค๊น์ง ์ ์ด๊ฐ ๊ฐ๋ฅํ์ฌ ๋์ฑ ๋ค์ํ ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต ๊ฐ๋ฅ.
- ์ด๋ฒคํธ ์ ๋ณด(๋ฐ์ ์์ ๋ฐ ์์น ๋ฑ)๋ฅผ ๋ฐํ์ผ๋ก ๊ทธ๋๊ทธ๋ ์ํฉ์ ์๋ง์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง.
<์ด๋ฒคํธ ๊ฐ์ฒด์ ์ฃผ์ ์์ฑ๊ณผ ๋ฉ์๋>
- type - ์ด๋ฒคํธ์ ํ์ ์ ๋ํ๋ (click, keydown, submit)
- target - ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ DOM ์์๋ฅผ ๊ฐ๋ฆฌํด
- currentTarget - ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ฐ์ํ ์์ ๊ฐ๋ฆฌํด(event.target), ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋ ์์๋ฅผ ๊ฐ๋ฆฌํด(event.currentTarget)
- preventDefault() - ๊ธฐ๋ณธ ๋์ ๋ฐฉ์ง
- stopPropagation() - ์ด๋ฒคํธ ์ ํ ์ฐจ๋จ
- clientX / clientY - ๋ง์ฐ์ค ์ด๋ฒคํธ ์ X,Y ์ขํ ์์น ๋ฐํ.
- key / keyCode - ํค๋ณด๋ ์ด๋ฒคํธ ์ ๋๋ฌ์ง ํค๊ฐ์ ์ฝ๋๋ฅผ ๋ฐํ.
<button id="button">๋ฒํผ ํด๋ฆญ</button>
<script>
let Button = document.getElementById("button");
Button.addEventListener("click", function (event) {
alert(`ํด๋ฆญ๋ ์์: ${event.target.tagName}`); // ํด๋ฆญํ ์์์ ํ๊ทธ ์ด๋ฆ ๋๋ฌธ์ ๋ฐํ
console.log(`Mouse position: X=${event.clientX}, Y=${event.clientY}`); // ํด๋ฆญ ์์น
});
</script>
โฌ๏ธ ์ถ๋ ฅ ํ๋ฉด
โ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์ ๋ด๋ถ์ this
: ํจ์๊ฐ ํธ์ถ๋ ๋งฅ๋ฝ์ ๋ฐ๋ผ this ๊ฐ์ด ๋ฌ๋ผ์ง.
ES5 - ํจ์ ๊ฐ ์๊ด์์ด this ๊ฐ ์ค์ ๊ฐ๋ฅํ bind ๋ฉ์๋ ๋์
.
ES6 - ์ค์ค๋ก์ this ๋ฐ์ธ๋ฉ์ ํ์ง ์๋ ํ์ดํ ํจ์๋ฅผ ์ถ๊ฐ.
โ ๊ธฐ๋ณธ ๊ท์น
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ window ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
- Node.js ํ๊ฒฝ์์ global ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
console.log(this);
// ๋ธ๋ผ์ฐ์ ์์๋ window ๊ฐ์ฒด ์ถ๋ ฅ
โ this (in ๋ฉ์๋)
- ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
let person = {
name: "ํ๊ธธ๋",
introduce: function () {
console.log(this.name);
},
};
person.introduce();
// ์ถ๋ ฅ: ํ๊ธธ๋
โ this (in ํจ์)
- ์ผ๋ฐ ํจ์์์๋ ํธ์ถ๋ ๋งฅ๋ฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง.
<์๊ฒฉ ๋ชจ๋> โ ํจ์์์ this๋ undefined๊ฐ ๋จ.
"use strict"; // ์๊ฒฉ ๋ชจ๋ ์ค์
function StrictThis() {
console.log(this); // undefined ์ถ๋ ฅ
}
StrictThis();
<๋น์๊ฒฉ ๋ชจ๋> โ ์ผ๋ฐ ํจ์์์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
function NoneStrictThis() {
console.log(this); // ๋ธ๋ผ์ฐ์ ์์๋ window ๊ฐ์ฒด ์ถ๋ ฅ
}
NoneStrictThis();
โ this (in ์์ฑ์ ํจ์)
- ์์ฑ์ ํจ์ ๋ฐ ํด๋์ค์์๋ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
function Person(name) {
this.name = name;
}
let HongGilDong = new Person("ํ๊ธธ๋");
console.log(HongGilDong.name); // this๋ ์๋ก ์์ฑ๋ HongGilDong ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
// ์ถ๋ ฅ: ํ๊ธธ๋
โ this (in ํ์ดํ ํจ์)
- ์์ ์ this ๊ฐ์ง์ง ์๊ณ , ์ธ๋ถ ์ค์ฝํ(์ ์ญ ๊ฐ์ฒด)์ this๋ฅผ ์ฌ์ฉ.
let person = {
name: "HongGilDong",
introduce: () => {
console.log(this.name); // ํ์ดํ ํจ์๋ ์ ์ญ ๊ฐ์ฒด์ this๋ฅผ ์ฌ์ฉํจ
},
};
person.introduce();
// ์ถ๋ ฅ: undefined
// (์ ์ญ ๊ฐ์ฒด์ name์ด ์๋ ๊ฒ ์๋๋ undefined ์ถ๋ ฅ)
โ ๋ช ์์ this ์ค์
- call() : ์ฒซ๋ฒ์งธ ์ธ์๋ก this๋ฅผ ์ง์ ํ์ฌ ํจ์์ ์ธ์๋ฅผ ํ๋์ฉ ๋๊ธฐ๋ฉฐ ํธ์ถ ๊ฐ๋ฅ.
function introduce() {
console.log(this.name);
}
let person = { name: "ํ๊ธธ๋" };
introduce.call(person);
// ์ถ๋ ฅ: ํ๊ธธ๋
- apply() : call()๊ณผ ์ ์ฌํ์ง๋ง, ํจ์์ ์ ๋ฌํ๋ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋๊น.
function introduce() {
console.log(this.name);
}
let person = { name: "ํ๊ธธ๋" };
introduce.apply(person);
// ์ถ๋ ฅ: ํ๊ธธ๋
- bind()
- ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋๋ฐ, ํด๋น ํจ์์ this๋ ๊ณ ์ .
function introduce() {
console.log(this.name);
}
let person = { name: "ํ๊ธธ๋" };
// bind๋ฅผ ์ฌ์ฉํ์ฌ this๊ฐ person์ผ๋ก ๊ณ ์ ๋ ์๋ก์ด ํจ์ ์์ฑ
let boundIntroduce = introduce.bind(person);
boundIntroduce();
// ์ถ๋ ฅ: ํ๊ธธ๋
โ this (in ์ด๋ฒคํธ ํธ๋ค๋ฌ)
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ํด๋น DOM ์์๋ฅผ ๊ฐ๋ฆฌํด.
<button id="myButton">๋ฒํผ ํด๋ฆญ</button>
<script>
document.getElementById("myButton").addEventListener("click", function() {
console.log(this); // ํด๋ฆญํ ๋ฒํผ ์์๋ฅผ ๊ฐ๋ฆฌํด
});
</script>
'๊ณต๋ถ > GDG' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FE] ์น&์ฑ ์ฐํฉ ์คํฐ๋ (0) | 2024.11.18 |
---|---|
React ํ๋ก์ ํธ ์์ฑ (0) | 2024.10.30 |
GDG-WEB 2์ฃผ์ฐจ ๊ณผ์ (0) | 2024.10.01 |
Javascript 1-4 ์ฐ์ฐ์ (0) | 2024.09.30 |
Javascript 1-3 ์ ์ด๋ฌธ (0) | 2024.09.30 |