๐ [๊ฐ์ ๋ด์ฉ ๋ฐ ๊ฐ๋
์ ๋ฆฌ]
๋ชฉ์ฐจ
DOM: Document Object Model์ ์ฝ์, HTML ์์๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ Object์ฒ๋ผ ์กฐ์ํ ์ ์๋ ๋ชจ๋ธ
script ํ์ผ์ ๋ก๋ํ๋ <script>
ํ๊ทธ์ ์์น์ ์์ฑ์ ํ์ฉํ์ฌ ์ต์ ํํ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์๋์ ์ผ๋ก ์คํํ๊ธฐ ์ํด, ์๋ ๊ฐ์ ์ ์ํด ์ค์ํ๋ค.
๋ค์์ ์ด์ ์ script ํ์ผ ๋ก๋์ ๊ด๋ จํ์ฌ ์ ๋ฆฌํด๋ ๋งํฌ๋ฅผ ์ฝ์
ํ์๋ค.
DOM์๋ ๋ง์ ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ์กด์ฌํ์ง๋ง, ์ฒ์ ์ง์คํด์ผ ํ ๋ถ๋ถ์ "CRUD(Create, Read, Update and Delete)"์ด๋ค.
์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ ๋ฉ์๋ (createElement
)
document.createElement('div')
ํ๋์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋ค์๋ค๊ณ ํด์ DOM ํธ๋ฆฌ์ ์ฐ๊ฒฐ๋ ๊ฒ์ ์๋๋ค. DOM ํธ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ Append
๋ผ๊ณ ํ๋ค.
์๋ฆฌ๋จผํธ๋ฅผ DOM ํธ๋ฆฌ์ ์ฐ๊ฒฐํ๋(์ฆ, ํ๋ฉด์ ์ถ๊ฐํ๋) ๋ฉ์๋ (append
)
const container = document.createElement('div');
document.body.append(container);
์๋ฆฌ๋จผํธ๋ฅผ ์กฐํํ๋ ๋ฉ์๋(querySelector
)
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');
์์ฑํ ์๋ฆฌ๋จผํธ์ ์ฝํ
์ธ ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ์์ฑ(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", "");
์ญ์ ํ๋ ค๋ ์์น์ ์์๋ฅผ ์๊ณ ์๋ ๊ฒฝ์ฐ (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
์ ๋ณด์์์์ ์ ์ฌ์ ์ํ์ฑ
<script>
ํ๊ทธ๋ ์๋ํ์ง ์๋๋ก ์ง์ ๋์ด ์์el.innerHTML = "<img src='x' onerror='alert(1)'>";
์ฐธ๊ณ ) รฌnnerHTML
์ ๋์ ํ์ฌ ์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
Node.textContent
์ฐธ๊ณ ) รฌ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 ๋ฑ์ ์ด์ฉํ์ฌ ํฌ๊ธฐ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.