document ๊ฐ์ฒด๋ฅผ ํตํด์ HTML element๋ฅผ ๋ง๋ค๊ณ (CREATE), ์กฐํํ๊ณ (READ), ๊ฐฑ์ ํ๊ณ (UPDATE), ์ญ์ ํ๋(DELETE) ๋ฐฉ๋ฒ์ ์ค์ต ํ, ์ ๋ฆฌํ๋ค.
DOM์ผ๋ก ์๋ก์ด HTML element๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
document.createElement('div') // ์๋ก์ด <div>์์๋ฅผ ์์ฑํ๋ค.
// ์์์ ์์ฑํ <div>์์๋ฅผ ๋ณ์ tweetDiv์ ํ ๋นํ๋ค.
const tweetDiv = document.creatElement('Div')
์์ ์ฝ๋๋ฅผ ์ ๋ ฅํด๋ ์์ฑ๋ง ๋์์ ๋ฟ, ์ฐ๊ฒฐ์ ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ ์์๋ '๊ณต์ค์ ๋ ์๋ ์ํ'์ด๋ค. ๋ฐ๋ผ์, ํ๋ฉด์ ๋ณํ๋ ์๊ธฐ์ง ์๋๋ค.
DOM์ผ๋ก ์์ฑ๋ HTML element๋ฅผ ๋ถ๋ชจ ๋ ธ๋์ ํฌํจํ๋ ๋ฐฉ๋ฒ์ด๋ค.
//์์์ ์์ฑํ <div>์์๋ฅผ ๋ด์ ๋ณ์ tweetDiv๋ฅผ <body>์์์ appendํ๋ค.
doucument.body.append(tweetDiv)
ํฌ๋กฌ์ ๊ฐ๋ฐ์๋๊ตฌ -> Elements ํญ์์ <body>
์์์ <div>
์์๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
DOM์ผ๋ก HTML element๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
querySelector
์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์
๋ ํฐ๋ฅผ ์ ๋ฌํ์ฌ element์ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์์ผ๋ฉฐ, HTML ์์('div'), id('#tweetList'), class('.tweet') ์ธ ๊ฐ์ง๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค.
// ํด๋์ค ์ด๋ฆ์ด tweet์ธ HTML ์์๋ฅผ ์กฐํํ๋ค.
const oneTweet = document.querySelector('.tweet')
// ํด๋์ค ์ด๋ฆ์ด tweet์ธ ์์๊ฐ ์ฌ๋ฌ๊ฐ ์๋ค๋ฉด, ์ฌ๋ฌ ๊ฐ์ ์์๋ฅผ ํ๋ฒ์ ๊ฐ์ ธ์ค์.
// ํด๋์ค ์ด๋ฆ์ด tweet์ธ ๋ชจ๋ ์์๋ฅผ ์ ์ฌ๋ฐฐ์ด๋ก ๋ฐ์์จ๋ค.
const tweets = document.querySelectorAll('.tweet')
querySelectorAll
์ ์ด์ฉํด ์กฐํํ ์์๋ค์ ๋ฐฐ์ด์ฒ๋ผ for๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. ๋จ, ๋ฐฐ์ด์ด ์๋๋ผ ์ ์ฌ ๋ฐฐ์ด(aka.๋ฐฐ์ด์ด ์๋ ๋ฐฐ์ด, ๋ฐฐ์ดํ ๊ฐ์ฒด ๋ฑ)์ด๋ค. (์ ์๋ช
์นญ์ Array like Object)Internet Explorer์ ๊ฐ์ด ์ด์ ๋ฒ์ ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค๋ฉด, ์๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ ์๋ ์๋ค.
์๋๋ get
์ผ๋ก ์์ํ๋ DOM ์กฐํ ๋ฉ์๋์ด๋ค.
const getOneTweet = document.getElementById('container')
const queryOneTweet = document.querySelector('#container')
console.log(getOneTweet === queryOneTweet) // true
CREATE์์ ์์ฑํ <div>
์์๋ <body>
์์์ ์์นํด์๋ค. container์ ๋ฃ๊ธฐ ์ํด์๋ ์๋ ์ฝ๋๋ฅผ ์
๋ ฅํด์ผํ๋ค.
// ID์ด๋ฆ์ด container์ธ HTML ์์๋ฅผ ์กฐํํ๋ค.
const container = document.querySelector('#container')
// CREATE์์ ์์ฑํ <div>์์๋ฅผ container์ ๋ง์ง๋ง ์์์์๋ก ์ถ๊ฐํ๋ค
container.append(tweetDiv)
ํฌ๋กฌ์ ๊ฐ๋ฐ์๋๊ตฌ -> Elements ํญ์์ <container>
์์์ <div>
์์๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
DOM์ผ๋ก HTML Element๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ด๋ค.
// UPDATE ์ค์ต์ ์ํด oneDiv๋ผ๋ ์ด๋ฆ์ <div>์์๋ฅผ ์์ฑํ๋ค.
const oneDiv = document.createElement('div');
console.log(oneDiv) // <div></div>
// textContent๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์์ฑํ <div>์์์ ๋ฌธ์์ด์ ์
๋ ฅํ๋ค.
oneDiv.textContent = 'dev';
console.log(oneDiv) // <div>dev</div>
// ๋ค๋ฅธ ์์๋ค ์ฒ๋ผ CSS ์คํ์ผ๋ง์ด ์ ์ฉ๋ ์ ์๋๋ก <div> ์์์ ๊ฐ์ ์ด๋ฆ์ class๋ฅผ ์ถ๊ฐํ๋ค.
oneDiv.classList.add('tweet')
//oneDiv.setAttribute('class', 'tweet')
console.log(oneDiv) // <div class="tweet">dev</div>
// UPDATE๋ ๋ด์ฉ: ๋ฌธ์์ด์ ์
๋ ฅํ์ฌ ํ
์คํธ๋ฅผ ์ฑ์ฐ๊ณ ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ ์คํ์ผ๋ง์ ์ ์ฉํจ
// append๋ฅผ ์ด์ฉํด container์ ์์์์๋ก ์ถ๊ฐํ๋ค.
const container = document.querySelector('#container')
container.append(oneDiv)
append ํ, ์ถ๊ฐํ <div>
์์๊ฐ tweet
์ ์คํ์ผ์ด ์ ์ฉ๋ ์ํ๋ก ํ๋ฉด์ ์ถ๋ ฅ๋๋ค.
setAttribute()๋ฅผ ์ด์ฉํด ์์ฑํ ์์์ attribute๋ฅผ ์ค์ ํด์ค ์ ์๋ค.
// ์์ด๋๊ฐ "javascript"์ด๊ณ , ๋ด์ฉ์ด "awesome"์ธ <a>์์๋ฅผ ์์ฑ
let aElement = document.createElement('a')
aElement.setAttribute('id', 'javascript') //<a> ์์์ ID๊ฐ Javascript๊ฐ ๋๋๋ก ์ค์
aElement.textContent = 'awesome'
// ์์์ ๊ฐ์ฅ ๋จผ์ ์์ฑํ <div>์์์ธ tweetDiv์ ์ญ์ ํ๋ค.
tweetDiv.remove()
๋จ, ์ฌ๋ฌ ๊ฐ์ ์์ ์์๋ฅผ ์ญ์ ํ๋ ค๋ฉด? ์๋์ ๊ธฐ์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผํ๋ค.
innerHTML
์ ์ด์ฉํด ๋ชจ๋ ์์ ์์๋ฅผ ์ง์ธ ์ ์๋ค.
// ID ์ด๋ฆ์ด container์ธ ์์ ์์๋ค์ ์ญ์ ํ๋ค.
document.querySelector('#container').innerHTML = '';
๊ทธ๋ฌ๋ ์์ ์ฝ๋๋ ์ ๋ชฉ์ ํด๋นํ๋ H2 'Tweet List'๊น์ง ์ญ์ ํ๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก removeChild
์ while
์ ์ด์ฉํด ์์์์๋ฅผ ์ญ์ ํ๋ค.
// ID ์ด๋ฆ์ด container์ธ HTML ์์๋ฅผ ์กฐํํ๋ค.
const container = document.querySelector('#container');
// container์ ์์์์๊ฐ 1๊ฐ๋ง ๋จ์ ๋๊น์ง, ๋ง์ง๋ง ์์์์๋ฅผ ์ ๊ฑฐํ๋ค.
while (container.children.length > 1) {
container.removeChild(container.lastChild);
}
์ดํ, ํ๋ฉด์ H2 'Tweet List'๋ง ์ถ๋ ฅ๋๋ค.
// class ์ด๋ฆ์ด tweet์ธ HTML ์์๋ฅผ ์กฐํํ๋ค.
const tweets = document.querySelectorAll('.tweet')
// forEach ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด class์ด๋ฆ์ด tweet์ธ ์์๋ค์ ์ ๊ฑฐํ๋ค.
// ์ฐธ๊ณ ๋ก forEach๋ ๋ฐฐ์ด์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค! (๋จ, ์์๋ค์ ์ ์ฌ๋ฐฐ์ด์ผ ๋ฟ ๋ฐฐ์ด์ด ์๋!)
tweets.forEach(function(tweet){
tweet.remove();
})
// for ~ of๋ฌธ์ ์ฌ์ฉํ์ฌ class ์ด๋ฆ์ด tweet์ธ ์์๋ค์ ์ ๊ฑฐํ๋ค.
for (let tweet of tweets){
tweet.remove()
}
์ ๋ชฉ์ธ H2 'Tweet List'๋ class์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ง ์๊ณ , ์์ ์ ๊ฑฐ๋ ์์๋ค๊ณผ ๊ฐ์ ID ์ด๋ฆ์ ๊ฐ์ก๊ธฐ ๋๋ฌธ์ ํ๋ฉด์ H2 'Tweet List'๋ง ์ถ๋ ฅ๋๋ค.
aElement
๋ฅผ HTML์์ ์ ๊ฑฐํ๊ธฐ ์ํ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๊ณ ๋ฅด์ธ์<body>
<div>
<div>hello</div>
<div id="world">
world
<a id="javascript"></a>
</div>
<span id="code">code</span>
<span>states</span>
</div>
</body>
let aElement = document.createElement('a')
aElement.setAttribute('id', 'javascript')
aElement.textContent = 'awesome'
1) document.deleteNode(aElement)
=> deleteNode ๋ผ๋ ๋ฉ์๋๋ ์๋ค.
2) aElement.remove()
3) document.querySelector("#world").remove()
=> #world ์ ์์๋ฅผ ์ ๋ถ ์ง์ด๋ค.
4) document.querySelector("#world").remove(aElement)
=> #world ์ ์์๋ฅผ ์ ๋ถ ์ง์ด๋ค.
5)document.querySelector("#world").removeChild(aElement)
<body>
<div>
<div>hello</div>
<div id="world">world</div>
<span id="code">code</span>
<span>states</span>
</div>
</body>
let aElement = document.createElement('a')
aElement.setAttribute('id', 'javascript')
aElement.textContent = 'awesome'
// TODO : ์ดํ์ ์จ์ผ ํ ์ฝ๋๋ฅผ ์ ํ์ง์์ ๊ณ ๋ฅด์ธ์.
1) document.querySelector('world').insertBefore(aElement)
=> insertBefore
์ ์ฐธ์กฐ๋ ๋
ธ๋ ์์ ํน์ ๋ถ๋ชจ ๋
ธ๋์ ์์ ๋
ธ๋๋ฅผ ์ฝ์
ํ๋ ๊ฒ์ผ๋ก,๋ฌธ๋ฒ์ let insertedNode = parentNode.insertBefore(newNode, referenceNode);
์ ๋ฐ๋ฅธ๋ค. referenceNode์ ๋ช
์์ ์ผ๋ก Node๋ null์ ์ ๋ฌํด์ผํ๋๋ฐ, Node์ผ ๊ฒฝ์ฐ ํด๋น Node์์ ์๋ก์ด ๋
ธ๋๊ฐ ์ฝ์
๋๊ณ , null์ผ ๊ฒฝ์ฐ ๋
ธ๋ ๋ชฉ๋ก ๋์ ์ฝ์
๋๋ค.
2) document.querySelector('#world').cloneNode(aElement)
=> cloneNode
๋ element๋ node๋ฅผ ๋ณต์ ํ๋ ๊ฒ์ผ๋ก , ๋ฌธ๋ฒ์ let ๋ณต์ ๋ ์๋ก์ด ๋
ธ๋ = ๋ณต์ ๋์ด์ผ ํ node.cloneNode(deep);
์ ๋ฐ๋ฅธ๋ค.
*deep: ํด๋น node์ children๊น์ง ๋ณต์ ํ๋ ค๋ฉด true, ํด๋น node๋ง ๋ณต์ ํ๋ ค๋ฉด false
3) document.getElementById('world').appendChild(aElement)
=> appendChild
๋ ํ ๋
ธ๋๋ฅผ ํน์ ๋ถ๋ชจ ๋
ธ๋์ ์์ ๋
ธ๋ ๋ฆฌ์คํธ ์ค ๋ง์ง๋ง ์์์ผ๋ก ๋ถ์ด๋ ๊ฒ์ผ๋ก, ๋ถ๋ฒ์ let aChild = element.appendChild(aChild);
์ ๋ฐ๋ฅธ๋ค. ๋ง์ฝ ์ฃผ์ด์ง ๋
ธ๋๊ฐ ์ด๋ฏธ ๋ฌธ์์ ์กด์ฌํ๋ ๋
ธ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ๋
ธ๋๋ฅผ ํ์ฌ ์์น์์ ์๋ก์ด ์์น๋ก ์ด๋์ํจ๋ค.
4) document.querySelector('world').prependChild(aElement)
=> prependChild
๋ผ๋ ๋ฉ์๋๋ ์กด์ฌํ์ง ์๋๋ค.
5) document.getElementById('#world').insertAfter(aElement)
=> insertAfter
๋ผ๋ ๋ฉ์๋๋ ์กด์ฌํ์ง ์๋๋ค.
Reference:
์ฝ๋์คํ
์ด์ธ
MDN