๐Ÿ“ŒDevelopment/JavaScript

[JS] DOM์ด๋ž€? #1 Node์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

geumsong 2023. 3. 26. 13:32

*DOM: ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ(The Document Object Model)

 

 

 

 

 

์›น๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•˜๊ณ , ํ™”๋ฉด์„ ํ†ตํ•ด ํ•ด์„๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
ํ•ด์„ํ•œ HTML ์ฝ”๋“œ๋ฅผ ํ™”๋ฉด์„ ํ†ตํ•ด ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ •์„ '๋ Œ๋”๋ง'์ด๋ผ ํ•œ๋‹ค.

 

 

- DOM์€ html ๋ฌธ์„œ์˜ ๊ฐ ์š”์†Œ๋“ค์„ ํŠธ๋ฆฌํ˜•ํƒœ๋กœ ๊ตฌ์กฐํ™”ํ•ด ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ์„œ(๋ฐ์ดํ„ฐ)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์„ ์ด์šฉํ•ด์„œ ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ DOM์ด๋ผ ํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” DOM์„ ํ†ตํ•ด ํ™”๋ฉด์— ์›น ์ฝ˜ํ…์ธ ๋“ค์„ ๋ Œ๋”๋งํ•œ๋‹ค.

 

 

   DOM๋ชฉ์ 

Q. Html ์ฝ”๋“œ์— ์จ์ ธ ์žˆ๋Š” ๋ฐ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๊ฒŒ ๋ธŒ๋ผ์šฐ์ € ์—ญํ• ์ธ๋ฐ

๊ตณ์ด ์ค‘๊ฐ„์— DOM์ด๋ผ๊ณ  ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด์œ ?

 

A. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ด ๋ฌธ์„œ์— ๋Œ€ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

DOM์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›น ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ ์ˆ˜์ • ์‚ญ์ œํ•˜๊ฑฐ๋‚˜

๋งˆ์šฐ์Šค ํด๋ฆญ, ํ‚ค๋ณด๋“œํƒ€์ดํ•‘ ๋“ฑ์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น๋ฌธ์„œ์— ๋Œ€ํ•œ ์–ด๋–ค ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜๋ฉด DOM์— ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜์˜๋˜์–ด ์›น ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์ด

๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š” ์ด๋Ÿฐ ํ๋ฆ„์ด๋‹ค.

Html ์ฝ”๋“œ๋Š” ์ •์ ์ธ ํ…์ŠคํŠธ์ด๋ฏ€๋กœ ์›น ํ™”๋ฉด์ด ์‚ฌ์šฉ์ž์™€ ๋™์ ์ธ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” DOM์ด ๊ทธ ์—ญํ• ์„ ํ•ด์ค„ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ.

 

 

 

 

 

- DOM ์€ nodes์™€ objects๋กœ ๋ฌธ์„œ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

- ์œ„์ชฝ: ๋ถ€๋ชจnode / ์•„๋ž˜์ชฝ: ์ž์‹node

- ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ node๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. (ex. element: <a>)

 

 

ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ (the page content)๋Š” DOM ์— ์ €์žฅ๋˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 


 

 

#1 Node์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

 

 

console ์ฐฝ ์—ด์–ด์„œ ์‹คํ–‰ํ•ด๋ณด์ž.

document.documentElement // HTML์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
document.body; //Body์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
document.head; //Head์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

๋ชจ๋“  html ํƒœ๊ทธ๋Š” ๊ฐ์ฒด์ด๋‹ค. ๊ฐ์ฒด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

document.body.style; // style์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ

-์ด๋ ‡๊ฒŒ ์ฝ”๋“œ์ž‘์„ฑํ•˜๋ฉด ๋งŽ์€ style์˜ ๊ฐ’์ด ๋œฐ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€

-์˜ˆ์‹œ: backgroundColor๊ฐ’์— "blue"๋ฅผ ์คฌ๋”๋‹ˆ

๋ฐฐ๊ฒฝ์ƒ‰์ด ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋ณ€ํ•œ ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ๋ฐฉ๋ฒ•์€ styleํƒœ๊ทธ์— ์ ‘๊ทผํ•˜์—ฌ ์ฐพ์•„์„œ ์ˆ˜์ •ํ•œ ๊ฒƒ์ด๊ณ , ์ง์ ‘์ ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

document.body.style.opacity = '0.5'; //ํˆฌ๋ช…๋„
document.body.style.padding = '100px'; //ํŒจ๋”ฉ๊ฐ’

 

opacity(ํˆฌ๋ช…๋„)๊ฐ’ 0.5๋ฅผ ์ฃผ์—ˆ๊ณ ,

๊ทธ ๋ฐ‘์— padding๊ฐ’ 100px์„ ์ฃผ์—ˆ๋‹ค.

 

 

  getElementById() - NodeList

์—ฌ๊ธฐ ๋ณด๋ฉด id๊ฐ€ first๋กœ ๋˜์–ด ์žˆ๋‹ค.

id๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด getElementById๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

const el = document.getElementById('first'); // el์€ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ const(๋งค๊ฐœ๋ณ€์ˆ˜)์˜ ์ด๋ฆ„
el;

 

 

๊ทธ ๋ฐ‘์— el;์น˜๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํƒœ๊ทธ๋‚ด์šฉ์œผ๋กœ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. pํƒœ๊ทธ๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด

const pList = document.getElementsByTagname:('p') // pList๋Š” ๋‚ด๊ฐ€ ์ง€์ •ํ•œ const์˜ ์ด๋ฆ„

 

pList;์น˜๋ฉด ์ ‘๊ทผ๊ฐ€๋Šฅ

pList;

 

 

์—ฌ๊ธฐ์„œ ์ž์„ธํžˆ ๋ณด๋ฉด ์ฒซ๋ฒˆ์งธ๋Š” element, ๋‘๋ฒˆ์งธ๋Š” elements๋ผ๊ณ  ์ ํ˜”์Œ.

id๋Š” ๊ฐ ํŽ˜์ด์ง€๋‹น ํ•œ ๊ฐœ๋ฐ–์— ๋ชป ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— element

p๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ์“ธ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— elements (s๋ฅผ ๋ถ™์ธ๋‹ค) ์•„๋ž˜ ์ฝ”๋“œ ์ฐธ๊ณ 

getElementById('first');
const pList = document.getElementsByTagname:('p')

 

 

 

- pList๋Š” for of๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

**JavaScript**

for(p of pList) {
    p.style.fontSize = '30px';
}
< '30px'

> for(p of pList) {
p.style.opacity= String (Math.random());
} // string=๋ฌธ์ž์—ด, ํˆฌ๋ช…๋„๋Š” ๋žœ๋คํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ”๋‹ค.
< '0.19335992616464348'

 

 

 

 

-getElements๋ฅผ ์ด์šฉํ•˜๋ฉด ClassName์ด๋‚˜ ByName์œผ๋กœ node์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

document.getElementsByClassName('link');

link๋ผ๋Š” ์š”์†Œ๊ฐ€ 3๊ฐœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

- .link๋ผ๊ณ  ํ•ด๋„ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

 

 

 

  querySelectorAll() - HTML collection

document.querySelectorAll('.link');

:3๊ฐœ์˜ ์š”์†Œ๊ฐ’์ด ๋‹ค ๋‚˜์˜ด.

 

 

- id์˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

:์•ž์— # ๋ถ™์ด๊ธฐ

 

* querySelectorAll(); ๋ชจ๋“  node๋ฅผ ๊ฐ€์ ธ์˜ด  

* querySelector(); ์ œ์ผ ์ฒ˜์Œ์˜ node๋งŒ ๊ฐ€์ ธ์˜ด

document.querySelector('.link');

 

 

document.querySelector('h3:nth-of-type(2)').style.color = 'red';
//2๋ฒˆ์งธ h3๋ฅผ ์ฐพ์•„์„œ ์ปฌ๋Ÿฌ๋ฅผ '๋นจ๊ฐ•'์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„์žˆ์Œ

 

 

-p์˜ ํƒœ๊ทธ ์ค‘ ์ง์ˆ˜๋ฒˆ์งธ๋งŒ ์ฐพ์•„ ์†์„ฑ ๋ฐ”๊พธ๊ธฐ

document.querySelectorAll('p:nth-of-type(2n)')

:for of()๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ์šฐ์ธก์˜ ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค.

 

 

 

// console ์ž…๋ ฅ ๊ฐ’
pList;
< NodeList()

 

-array(๋ฐฐ์—ด)๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— for of ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ , index๋ฅผ ํ†ตํ•ด ๊ฐ node์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค. length๋ฅผ ์ด์šฉํ•ด ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” push(), pop(), filter(), join()๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉX

 

 


 

 getElementById์™€ querySelector์˜ ์ฐจ์ด์ 

element = document.getElementById(id);
  • getElementById : id๋ฅผ ํ†ตํ•ด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ document์— ๊ตฌ์ฒด์ ์ธ ID์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์—†๋‹ค๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

element = document.querySelector(selectors);
  • querySelector: selector์˜ ๊ตฌ์ฒด์ ์ธ ๊ทธ๋ฃน๊ณผ ์ผ์น˜ํ•˜๋Š” document์•ˆ ์ฒซ๋ฒˆ์งธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ผ์น˜ํ•˜๋Š”๊ฒŒ ์—†์œผ๋ฉด null๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์˜ˆ์‹œ 1)

<form id="userForm">
  <input id="username" type="text" value="Guilherme" />
</form>

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์šฐ๋ฆฌ๋Š” username ์š”์†Œ๋ฅผ ์–ป๊ณ  ์‹ถ๊ณ  ์ด๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค.

 

var username = document.getElementById("username");
var username = document.querySelector("#userForm #username");

์ฒซ๋ฒˆ์งธ๋Š” getElementById๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” querySelector์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, querySelector๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ๋” ๊ตฌ์ฒด์ ์ด๊ณ  ํ•œ์ •์ ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค! (๋ณดํ†ต ํ•œ์ •์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ์•„์ด๋””๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค)

 

 

์˜ˆ์‹œ 2)

<form id="productForm">
  <input id="productOne" class="product" type="text" value="Product 1" />
  <input id="productTwo" class="product" type="text" value="Product 2" />
  <input id="productThree" class="product" type="text" value="Product 3" />
</form>

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  products ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์–ป๊ณ  ์‹ถ๊ณ  ์ด๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค.
getElementByClassName์„ ํ†ตํ•ด ์‚ฌ์šฉํ•ด๋ณด์ž.

var products = document.getElementsByClassName("product");

์ด๋ฒˆ์—๋Š” querySelectorAll์„ ํ†ตํ•ด ๊ฐ™์€ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์–ป์–ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

var products = document.querySelectorAll("#productForm .product");

๊ฒฐ๊ณผ๋Š” ๊ฑฐ์˜ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ getElementsByClassName์€ HTMLCollection์— ๋ฆฌํ„ด์ด ๋˜๊ณ  querySelectorAll์€ NodeList์— ๋ฆฌํ„ด์ด ๋œ๋‹ค.

๐Ÿ’˜ ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ HTMLcollection์€ ๋ญ๊ณ  NodeList๋Š” ๋ฌด์—‡์ธ๊ฐ€??
์šฐ์„ , ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณด๋ฉด ๋‘˜ ๋‹ค ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ๊ฐ ํ•ญ๋ชฉ์„ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. HTMLCollection์˜ ํ•ญ๋ชฉ์€ name, id ์†์„ฑ์œผ๋กœ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, NodeList์˜ ํ•ญ๋ชฉ์€ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋กœ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 


๋งˆ์ง€๋ง‰ ๊ฒฐ๋ก 

๋งŒ์•ฝ ๋” ๊ตฌ์ฒด์ ์ธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, querySelector๊ทธ๋ฆฌ๊ณ  querySelectorAll์„ ์‚ฌ์šฉํ•ด๋ณด์ž!
๊ทธ๋Ÿฌ๋‚˜ ์œ„ ๋‘˜์— ๋น„ํ•ด getElementByID๊ฐ€ ๋” ๋น ๋ฅด๊ณ  ๋” ์ž˜ ์ง€์›์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์ž. ์ฐธ๊ณ ํ•œ 2๋ช…์˜ ๊ฐœ๋ฐœ์ž๋“ค์€ querySelector๋Œ€์‹ ์— getElementById๋ฅผ ๋”๋งŽ์ด์“ด๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค.

 

 

 

์ฐธ๊ณ :

https://velog.io/@hovelopin/JS-DOM-%EC%A0%9C%EC%96%B4