[SEB_FE_45] 2023.05.01 / DOM

Kayยท2023๋…„ 5์›” 8์ผ
1

๐Ÿ“– [๊ฐ•์˜ ๋‚ด์šฉ ๋ฐ ๊ฐœ๋… ์ •๋ฆฌ]
๋ชฉ์ฐจ

  • DOM ๊ธฐ์ดˆ
  • DOM ๋‹ค๋ฃจ๊ธฐ

[DOM ๊ธฐ์ดˆ]

DOM: Document Object Model์˜ ์•ฝ์ž, HTML ์š”์†Œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Object์ฒ˜๋Ÿผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ

[script ํŒŒ์ผ์˜ ์œ„์น˜ ๋ฐ ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ ์ตœ์ ํ™”]

script ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” <script> ํƒœ๊ทธ์˜ ์œ„์น˜์™€ ์†์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์˜๋„์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ค‘์š”ํ•˜๋‹ค.
๋‹ค์Œ์€ ์ด์ „์— script ํŒŒ์ผ ๋กœ๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ •๋ฆฌํ•ด๋‘” ๋งํฌ๋ฅผ ์‚ฝ์ž…ํ•˜์˜€๋‹ค.

[DOM ๋‹ค๋ฃจ๊ธฐ]

DOM์—๋Š” ๋งŽ์€ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ์ฒ˜์Œ ์ง‘์ค‘ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ "CRUD(Create, Read, Update and Delete)"์ด๋‹ค.

Create

์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ (createElement)

document.createElement('div')

ํ•˜๋‚˜์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ด์„œ DOM ํŠธ๋ฆฌ์— ์—ฐ๊ฒฐ๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. DOM ํŠธ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ Append๋ผ๊ณ  ํ•œ๋‹ค.

Append

์—˜๋ฆฌ๋จผํŠธ๋ฅผ DOM ํŠธ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜๋Š”(์ฆ‰, ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•˜๋Š”) ๋ฉ”์„œ๋“œ (append)

const container = document.createElement('div');
document.body.append(container);

Read

์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ(querySelector)

  • ์„ ํƒ์ž๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ์„ ํƒ์ž๋กœ๋Š” HTML ์š”์†Œ, id, class๋ฅผ ์‚ฌ์šฉ
const container = document.querySelector('.container');

์œ„ ์ฝ”๋“œ๋Š” class๊ฐ€ 'container'์ธ ์š”์†Œ๋“ค ์ค‘ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
๋งŒ์•ฝ class๊ฐ€ 'container'์ธ ์š”์†Œ๊ฐ€ ๋งŽ๊ณ , ๊ทธ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ๋ฐ›์•„์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ(querySelectorAll)

const containers = document.querySelectorAll('.container');

์œ„ ์ฝ”๋“œ๋Š” Object ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์œ ์‚ฌ๋ฐฐ์—ด(Array-like-Objects) ํ˜•ํƒœ๋กœ ๋ฐ›์•„์˜จ๋‹ค.

์ฐธ๊ณ ) Array-like-Object์— ๊ด€ํ•ด ์ •๋ฆฌํ•œ ๋งํฌ
DOM Enlightenment ์ •๋ฆฌ (1์žฅ) 1.13 ~ 1.15

๊ทธ ์™ธ ์˜ˆ์ „์— ์‚ฌ์šฉํ•˜๋˜ DOM ์กฐํšŒ ๋ฉ”์„œ๋“œ(getElementBy~)

// ๊ฒฐ๊ณผ๋Š” ๋‹จ์ˆ˜ Object
const container = document.getElementById('container');
// ๊ฒฐ๊ณผ๋Š” ์œ ์‚ฌ๋ฐฐ์—ด
const items = document.getElementByClassName('items');
// ๊ฒฐ๊ณผ๋Š” ์œ ์‚ฌ๋ฐฐ์—ด
const liLists = document.getElementByTagName('li');
// ๊ฒฐ๊ณผ๋Š” ์œ ์‚ฌ๋ฐฐ์—ด
const names = document.getElementsByName('names');

Update

์ƒ์„ฑํ•œ ์—˜๋ฆฌ๋จผํŠธ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ(textContent)

const container = document.createElement('div');
document.body.append(container);

container.textContent = 'Container';
console.log(container.textContent) 
// <div>Container</div>

์œ„ ์ฝ”๋“œ๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  body ํƒœ๊ทธ์— ์ถ”๊ฐ€ํ•˜์—ฌ DOM ํŠธ๋ฆฌ ์—ฐ๊ฒฐ๊นŒ์ง€ ๋œ container๋ผ๋Š” ๋ณ€์ˆ˜์˜ ์—˜๋ฆฌ๋จผํŠธ์— textContent๊นŒ์ง€ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์ด๋‹ค.

CSS ์Šคํƒ€์ผ๋ง์„ ์œ„ํ•ด class๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(classList์˜ add ๋ฉ”์„œ๋“œ)

container.classList.add('container');

์—˜๋ฆฌ๋จผํŠธ์— ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ(setAttribute)

const button = document.querySelector("button");

button.setAttribute("name", "helloButton");
button.setAttribute("disabled", "");

Element.setAttribute()

Delete

์‚ญ์ œํ•˜๋ ค๋Š” ์œ„์น˜์˜ ์š”์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ (remove)

const container = document.querySelector('#container');
const oneDiv = document.createElement('div');
container.append(oneDiv);
oneDiv.remove(); // append ํ–ˆ๋˜ ์š”์†Œ ์‚ญ์ œ

๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ์ง€์šฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ (innerHTML = '')

const container = document.querySelector('#container');
container.innerHTML = '';

์ฐธ๊ณ ) รฌnnerHTML์˜ ๋ณด์•ˆ์—์„œ์˜ ์ž ์žฌ์  ์œ„ํ—˜์„ฑ

  • innerHTML์— <script> ํƒœ๊ทธ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •๋˜์–ด ์žˆ์Œ
  • ํ•˜์ง€๋งŒ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž์—ด์„ ์„ค์ •ํ•  ๋•Œ ์—ฌ์ „ํžˆ ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ์Œ
    ex) el.innerHTML = "<img src='x' onerror='alert(1)'>";

์ฐธ๊ณ ) รฌnnerHTML์„ ๋Œ€์‹ ํ•˜์—ฌ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ฐธ๊ณ ) รฌnnerHTML์„ ๋Œ€์‹ ํ•˜์—ฌ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

const container = document.querySelector('#container');
while (container.firstChild) {
  container.removeChild(container.firstChild);
}

const tweets = document.querySelectorAll('.tweet')
for (let tweet of tweets){
    tweet.remove()
}

์‹ฌํ™”

DOM๊ณผ JavaScript์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
createDocumentFragment๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๋” ํšจ์œจ์ ์œผ๋กœ DOM์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
HTML5 template tag ์‚ฌ์šฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
element์™€ node์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
children๊ณผ childNodes์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
remove์™€ removeChild์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ™์€ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ appendChild ํ•˜๋ฉด, ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ณต์‚ฌํ• ๊นŒ?
offsetTop ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ์ขŒํ‘œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
offsetWidth ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€