๐๐ปโโ๏ธ ๋ชฉํ: ๋ฉด์ ์ ์ค๋นํ๊ธฐ ์ด์ ์ ์์๋ ๋ด์ฉ๋ค์ ๋ํ ๊ฐ๋ ์ ์ ๋ฆฌํด ๋ณด์.
๐MDN ์น ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ๋์ ์น ๋ธ๋ผ์ฐ์ ์ ์กฐ์ฌ์์ ๋ง๋ Web APIs์ค์์ ๋ฌธ์๊ฐ์ฒด๋ชจ๋ธ์ด๋ค. ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํด ๋ณด์.
JS ์
์ฅ์์ HTML์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์์ ๋ ๋ฌธ์๋ ์ด๋ค ๋ฐ์ดํฐ๋ก ๋ณด์ผ๊น? ๋ฐ๋ก ๋ฌธ์์ด์ด๋ค. img
ํ๊ทธ๋ผ๊ณ ์๋ ค์ค ๊ฒ๋ JS๋ ๋ฌธ์์ด๋ก ๋ณด๊ธฐ ๋๋ฌธ์ ํ๊ทธ์ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ JS๋ ์ต์ํ์ ์ด๋์ ๋ ์๋ฏธ๊ฐ ์๋ ๋จ์๋ก ์ชผ๊ฐฏ์ด์ผ ํ์๋ค.
์ฐธ์กฐ
MDN: DOM ์๊ฐ
JS๋ ํ๊ทธ์ ๊ด๊ณ๋๋ฅผ ์๊ณ ์ถ์๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ์ ์ฒด๋ฅผ ํ ๊ฐ๋ฌธ์ ํํ๋ก ๋ง๋ค๊ธฐ ์์ํ๊ณ ์ ๋ณด๋ ์ธ์ธํ๊ฒ ๊ธฐ์ ํ์ผ๋ฉฐ ๊ธฐ์ ํ ์๋ฃ๋ ์ค๋ธ์ ํธ ํ์์ผ๋ก ๋จ๊ฒผ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ณด ํ๋ํ๋๋ฅผ ๋
ธ๋
๋ผ๊ณ ๋ถ๋ฅด์๊ณ ์ฝ์ํ์๋ค.
const child1 = {
nodeType: 1.
nodeName: 'div',
childNode: [],
attributes: []
}
๋ ธ๋๋ HTML๋ฌธ์ ์ ๋ฐ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ค.
document.querySelector
๋ฅผ ์๋๊ฐ. ์ฐ๋ฆฌ๋ childNode
nextSibling
๊ณผ ๊ฐ์ ์ง๊ด์ ์ผ๋ก๋ ์์๋ณผ ์ ์๋ ๋
ธ๋๋ฅผ ํตํด ๊ด๊ณ๋ฅผ ์ดํดํ๊ฒ ๋์๊ณ , ๊ฒฐ๊ตญ JS ์์ง์ ์ด๋ค ์ฌ์ด๋ฅผ ์กฐ์ํ ์ ์๊ฒ ๋์๋ค.
'DOM์ ๊นจ์ฐ์น๋ค' ๋ผ๋ ์ฑ ์ ๋ณด๋ฉด ๋ ธ๋๋ ๋ํ์ ์ผ๋ก ๋ง์ด ์ฐ์ด๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
๋ฌผ๋ก ๋ค๋ฅธ ๊ฒ๋ ์ฐ์ด์ง๋ง ํ์ฌ ํ์ด์ง์์๋ ๋ ๊ฐ์ง๋ง ๋ค๋ฃฌ๋ค.
// (1)Document Nodes
// -HTML๋ฌธ์ ์ ๋ฐ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์
// -document.querySelector(๋ํ์ )
// (2)Element Nodes
// -node์ ์ง์ง ์ค์ฉ์ ์ธ ๋ถ๋ถ
// -element = ํ๊ทธ
// -์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ: getAttribute(), setAttribute(), classList(), ๋ฑ๋ฑ...
console.log(atts.getAttribute('title')); //์์ฑ๊ฐ ์ฐพ๊ธฐ
console.log( //์๋๊ฐ & ์๋๊ฐ
atts.hasAttribute('href'),
atts.hasAttribute('title'),
atts.hasAttribute('style'),
atts.hasAttribute('data-foo'),
)
console.log(atts.setAttribute('style')) //์์ฑ๊ฐ ์ง์ ํ๊ธฐ
// โญ๏ธ๊ถ๊ธ3)classList๋?
// -๊ธฐ๋ฅ: add, remove, toogle
parent.classList.add('hello') //์ต์ ์ ์๋กญ๊ฒ ์๊ธด ๋ฐฉ์
// โฃ<div class="parent hello">
parent.setAttribute('class', 'hello') //์๋ ์ ๋ถํธํ๋ ๋ฐฉ์
// โฃ<div class="hello">
parent.classList.toogle('visible'); //on & off
// โญ๏ธ๊ถ๊ธ4)๋ ๋ค๋ฅธ ๊ธฐ๋ฅ
parent.innerHTML = '<div>hello</div>'
// โฃ"<div>hello</div>"
parent.innerText = 'bye' //ํ
์คํธ๋ง ๋ฐ๊พธ๊ณ ์ถ์ ๋
// โฃ"bye"
๋์ ์น ๋ธ๋ผ์ฐ์ ์์ ๋ง๋ Web APIs์ ๋ฌธ์๊ฐ์ฒด๋ชจ๋ธ์ด๋ค. DOM์์ ๋์ค๋ ์กฐ์๊ณผ ์ด๋ฒคํธ๊ฐ ์ค์ํ๋ฐ ๋ํ์ ์ผ๋ก document node
element node
event handling
์ด ์๋ค. ๋์ JS๋ฅผ ๋ฐ์ ์์ผฐ๊ณ ๊ทธ๋ค๋ง์ ๊ฐ๋ ฅํ ์ปค๋ฎค๋ํฐ๊ฐ ํ์ฑ๋์์ผ๋ฉฐ ๋
์์ ์ผ๋ก ๋ฐ์ ํ์ฌ ์ด๋ฒคํธ ํธ๋ค๋ง์ ๋ฐฉ์์ ์ข ๋ ์ฝ๊ฒ ๊ตฌํํด ๋ด๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด๋๋ค. ํ์ฌ ๋ฆฌ์กํธ, ์ ์ด์ฟผ๋ฆฌ, ๋ ์กฐ, ๋ชจ ํด์ฆ๋ฅผ ํ์์ํจ ๊ฒ์ด๋ค.
// ์ฉ์ด์ ๋ฆฌ๐ฅ
// (1) DOM: HTML, XML๊ณผ ๊ฐ์ ๋ฌธ์๋ฅผ ํ๋ก๊ทธ๋๋ฐ ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋ฌธ์๊ฐ์ฒด๋ชจ๋ธ
// (2) Parse: ๋ฌธ์ฅ์ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ถ์ํ๋ค, ํ๋ก๊ทธ๋๋ฐ์์ parse๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๋ฌธ์๋ฅผ ๋์ฝ๋ฉ ํ๋ค๋ ๋ป
// (3) Parsing: Parse์ ์งํํ, ๋ฌธ์๋ฅผ ์๋ฏธ์๋ ๊ฐ์ฒด๋ก ๋ง๋๋ ์์
(HTML์ parsingํด์ DOM์ ํํ๋ก ๋ง๋ ๋ค.)
// (4) node: ๋ฐ๊พธ๋ ํํ(๋๋์ฒด ๋ฌด์์ผ๋ก ๋ฐ๊พธ๋ ๊ฐ์ ๋ํ ์ ๋ต, JS๋ก ์กฐ์+์ ์ดํ๊ธฐ ์ํด ์ชผ๊ฐ๋์ ํํ)
// -์ข
๋ฅ: ๋ฌด์ํ ๋ง์
// ํ๊ทธ์์ฒด: ELEMENT_NODE = 1
// ํ๊ทธ์์์์ฑ: ATTRIBUTE_NODE = 2
// ํ
์คํธ์ ๋ณด: TEXT_NODE = 3
// ์ฝ๋ฉํธ์ ๋ณด: COMMENT_NODE = 8
// โฃ
// -์ปจ์
: node๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๊ฐ๋ฌธ์ ๊ด๊ณ์ ๊ดํ ๊ฒ๋ค์ด ๋ง์(ํธ๋ฆฌ์์ ๊ด๊ณ, e.g., lastChild, nextSibling, parentNode, previousSibling, ...)
// (5) traverse: ํก๋จ(JS์์์ ๋ป์ "ํ๊ณ ํ๊ณ ํ๊ณ ๋ด๋ ค๊ฐ์ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ์ฐพ๋ ๊ฒ. ๋
ธ๋ํ์
= 3 ์ด๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฒ๊ณผ ๊ทธ๊ฒ์ ์ฐพ๋ ๊ฒ์ฒ๋ผ ๊ธฐ๋ณธ์ ์ผ๋ก JS์์ง์์๋ traverseํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ")
// 4. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ปดํ์ผ ์ธ์ด์ด์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ธ ์ด์
// -์ค๋ช
: JS์์ง์ ๋ฌธ์๋ฅผ ๊ธฐ๊ณ์นํ์ด๋ก ๋ฐ๊พผ ๋ค์(์ปดํ์ผ)-> ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ์ฝ์(์ธํฐํ๋ฆฌํธ)
// -์ปจ์
์ด์ : ์์ชฝ์ ์ฅ์ ์ ๋ชจ๋ ์ป๊ธฐ ์ํจ๐ฅ
๋ธ๋๊ฐ๋ฌธ ใ ใ ใ ใ ๋น์ ๊ฐ ์ฐฐ์ง๋ค์ ใ ใ