wa_ter_ve

Javascript 2 DOM ๋ณธ๋ฌธ

๊ณต๋ถ€/GDG

Javascript 2 DOM

์ˆ˜win 2024. 10. 7. 17:03

๐Ÿ“Œ DOM (Document Object Model) 

; ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ

์›น ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ์ฒด๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹.
๋ฌธ์„œ์˜ ์š”์†Œ๋“ค์€ ๋…ธ๋“œ๊ฐ€ ๋˜์–ด ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ. 
์ด ๊ฐ์ฒด๋“ค์„ Javascript๋ฅผ ํ†ตํ•ด ์ˆ˜์ •, ์‚ญ์ œ, ์ถ”๊ฐ€ ๋“ฑ ๋™์ ์œผ๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅ.
 

DOM Tree

 
 


 

 
 

๐Ÿ”ต ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ (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>