NodeList์ HTMLCollection์ ๋ชจ๋ DOM(๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)์์ ์ฌ๋ฌ ์์๋ฅผ ์ ํํ์ฌ ๋ฐํํ ๋ ์ฌ์ฉ๋๋ ๋ฐฐ์ด๊ณผ ์ ์ฌํ(array-like) ๊ฐ์ฒด์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ํ ์ฐจ์ด์ ์ด ์์ผ๋ฉฐ, ์ด ์ฐจ์ด์ ์ ๋ฐ๋ผ ํ ์ ์๋ ์ผ๊ณผ ์ฃผ์ํ ์ ์ด ๋ฌ๋ผ์ง๋๋ค.
NodeList vs HTMLCollection: ์ฐจ์ด์ ๋ฐ ํ์ฉ ๊ฐ๋ฅ์ฑ
1. ํต์ฌ ์ฐจ์ด: ์ค์๊ฐ(Live) vs. ์ ์ (Static)
์ด๊ฒ์ด ๋ ๊ฐ์ฒด์ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ์ด๋ฉฐ, ํ์ฉ ๋ฐฉ์์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- HTMLCollection (์ค์๊ฐ - Live)
- DOM ๊ตฌ์กฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ์ค์๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, HTMLCollection์ ์ป์ ํ์ DOM์์ ํด๋น ์ปฌ๋ ์ ์ ํฌํจ๋ ์์๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ฉด, HTMLCollection ๊ฐ์ฒด๋ ๋ณ๋์ ์ฝ๋ ์คํ ์์ด๋ ๊ทธ ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ๋ฐ์ํฉ๋๋ค.
- ํ ์ ์๋ ์ผ: DOM์ด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ต์ ์ํ์ ์์ ๋ชฉ๋ก์ ํญ์ ์ ์งํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค. (์: getElementsByTagName์ผ๋ก ํน์ ํ๊ทธ์ ๊ฐ์๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง).
- NodeList (๋๋ถ๋ถ ์ ์ - Static)
- **๋๋ถ๋ถ ์ ์ (Static)**์ ๋๋ค. (document.querySelectorAll()์ด ๋ฐํํ๋ NodeList๊ฐ ๋ํ์ ์ธ ์ ์ NodeList์ ๋๋ค.)
- NodeList๊ฐ ์์ฑ๋ ์์ ์ DOM ์ค๋ ์ท์ ๋ด๊ณ ์์ผ๋ฉฐ, ๊ทธ ์ดํ์ DOM ๋ณ๊ฒฝ ์ฌํญ(์์ ์ถ๊ฐ/์ญ์ ๋ฑ)์ ์๋์ผ๋ก ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์์ธ: Node.childNodes ํ๋กํผํฐ๊ฐ ๋ฐํํ๋ NodeList๋ ์ค์๊ฐ(live)์ ๋๋ค.
- ํ ์ ์๋ ์ผ: ํน์ ์์ ์ DOM ์ํ์ ๋ํ ๊ณ ์ ๋ ๋ชฉ๋ก์ด ํ์ํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ฐ์ง ์์ผ๋ฏ๋ก ๋ฐ๋ณต๋ฌธ ์์์ ์์๋ฅผ ์ถ๊ฐ/์ญ์ ํ ๋ ์๊ธฐ์น ์์ ๋์์ ์ค์ผ ์ ์์ต๋๋ค.
2. ํฌํจํ๋ ๋ ธ๋ ํ์
- HTMLCollection
- ์ค์ง Element ๋ ธ๋(HTML ํ๊ทธ ์์)๋ง ํฌํจํฉ๋๋ค. (์: <div>, <span>, <li> ๋ฑ)
- NodeList
- Element ๋ ธ๋๋ฟ๋ง ์๋๋ผ Text ๋ ธ๋(ํ ์คํธ ๋ด์ฉ), Comment ๋ ธ๋(์ฃผ์) ๋ฑ ๋ชจ๋ ์ข ๋ฅ์ Node ํ์ ์ ํฌํจํ ์ ์์ต๋๋ค. (์: parentNode.childNodes๋ ๋ถ๋ชจ ์์์ ๋ชจ๋ ์์ ๋ ธ๋๋ฅผ ํฌํจํ๋ฉฐ, ํ ์คํธ ๋ ธ๋๋ ์ฃผ์ ๋ ธ๋๋ ํฌํจ๋ ์ ์์ต๋๋ค.)
3. ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์๋ ๋ฐ ์์ฑ (ํ ์ ์๋ ์ผ)
- ๊ณตํต์ (๋ ๊ฐ์ฒด ๋ชจ๋ ๊ฐ๋ฅํ ์ผ):
- length ์์ฑ: ํฌํจ๋ ๋ ธ๋์ ์ด ๊ฐ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ธ๋ฑ์ค ์ ๊ทผ: collection[0], nodeList[1]์ ๊ฐ์ด ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ ธ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- for...of ๋ฃจํ:ES6์ for...of ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค.
- forEach() ๋ฉ์๋: forEach() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ ธ๋์ ๋ํด ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ ์ ์์ต๋๋ค. (๋จ, ์ผ๋ถ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ HTMLCollection์ forEach()๊ฐ ์์ ์ ์์ผ๋ฏ๋ก Array.from() ๋ฑ์ผ๋ก ๋ฐฐ์ด๋ก ๋ณํ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํ ์ ์์ต๋๋ค.)
- HTMLCollection์๋ง ์๋ ๊ฒ (์ถ๊ฐ๋ก ํ ์ ์๋ ์ผ):
- item(index) ๋ฉ์๋: collection.item(0)๊ณผ ๊ฐ์ด ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ ธ๋์ ์ ๊ทผํฉ๋๋ค. (์ธ๋ฑ์ค ์ ๊ทผ collection[0]๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ํฉ๋๋ค.)
- namedItem(name) ๋ฉ์๋: ์ปฌ๋ ์ ๋ด์ ์์ ์ค name ๋๋ id ์์ฑ๊ฐ์ด ์ฃผ์ด์ง ์ด๋ฆ๊ณผ ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
- NodeList (ํนํ ์ ์ NodeList)์ ํ์ฉ ํ (์ถ๊ฐ๋ก ํ ์ ์๋ ์ผ):
- NodeList๋ forEach() ๋ฉ์๋๋ฅผ ์ง์ ์ง์ํ๋ฏ๋ก ๋ฐฐ์ด์ฒ๋ผ ํธ๋ฆฌํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
- NodeList๋ฅผ Array.from(nodeList) ๋๋ ์คํ๋ ๋ ๋ฌธ๋ฒ [...nodeList]๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด๋ก ๋ณํํ๋ฉด, map(), filter(), reduce() ๋ฑ ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ๋ ฅํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ NodeList์ ์ค๋ ์ท ํน์ฑ๊ณผ ๊ฒฐํฉ๋์ด ์์ธก ๊ฐ๋ฅํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
4. ์์ฑ๋๋ ๋ฉ์๋ ์์
- HTMLCollection์ ๋ฐํํ๋ ๋ฉ์๋:
- document.getElementsByTagName()
- document.getElementsByClassName()
- element.getElementsByTagName() (ํน์ ์์ ๊ธฐ์ค)
- element.getElementsByClassName() (ํน์ ์์ ๊ธฐ์ค)
- element.children (ํ๋กํผํฐ)
- NodeList๋ฅผ ๋ฐํํ๋ ๋ฉ์๋:
- document.querySelectorAll() (์ ์ NodeList)
- element.querySelectorAll() (์ ์ NodeList)
- parentNode.childNodes (ํ๋กํผํฐ, ์ค์๊ฐ NodeList)
๊ฒฐ๋ก ์ ์ผ๋ก, HTMLCollection์ DOM ๋ณ๊ฒฝ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ํ๋ "์ด์์๋" ๋ชฉ๋ก์ด ํ์ํ ๋ ์ฌ์ฉํ์ง๋ง, Element๋ง ํฌํจํ๊ณ forEach ์ง์์ ์ ์ฝ์ด ์์ ์ ์์ต๋๋ค. ๋ฐ๋ฉด NodeList๋ (์ฃผ๋ก querySelectorAll์ ํตํด ์ป๋ ๊ฒฝ์ฐ) "์ ์ ์ธ" ์ค๋ ์ท์ด์ง๋ง forEach๋ฅผ ์ง์ํ๋ฉฐ ๋ชจ๋ ๋ ธ๋ ํ์ ์ ํฌํจํ ์ ์์ต๋๋ค. ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๋ document.querySelectorAll()์ ์ฌ์ฉํ์ฌ ์ ์ ์ธ NodeList๋ฅผ ์ป์ ํ, ํ์์ ๋ฐ๋ผ Array.from() ๋ฑ์ ํตํด ์ค์ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐฐ์ด์ ํ๋ถํ ๋ฉ์๋๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ด ๋ณดํธ์ ์ ๋๋ค.
์ ๊ณตํด์ฃผ์ ์ด๋ฏธ์ง์ appendChild()์ insertAdjacentElement()๋ ๋ชจ๋ DOM(๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋์ ๋๋ค. ํ์ง๋ง ๋์ ๋ฐฉ์, ์ฝ์ ์์น ์ง์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ์ธ์๋ก ๋ฐ๋ ๊ฐ์ ์ค์ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
appendChild()
- ๋ฌด์์ ์ฝ์ ํ๋๊ฐ?: Node ๊ฐ์ฒด๋ฅผ ์ฝ์ ํฉ๋๋ค. ์ด๋ Element ๋ ธ๋(<div>, <span> ๋ฑ)๋ฟ๋ง ์๋๋ผ Text ๋ ธ๋, Comment ๋ ธ๋ ๋ฑ ๋ชจ๋ ์ข ๋ฅ์ ๋ ธ๋๊ฐ ๋ ์ ์์ต๋๋ค.
- ์ด๋์ ์ฝ์ ํ๋๊ฐ?: ํธ์ถ๋ ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ผ๋ก ์ฝ์ ํฉ๋๋ค. ํญ์ ๋์ ์ถ๊ฐ๋ฉ๋๋ค.
- ๋ฌธ๋ฒ: parentNode.appendChild(newNode)
- parentNode: ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ ๋ถ๋ชจ ์์.
- newNode: ๋ถ๋ชจ ์์์ ์์์ผ๋ก ์ถ๊ฐํ Node ๊ฐ์ฒด.
- ํน์ง:
- ๋จ ํ๋์ ๋ ธ๋๋ง ์ธ์๋ก ๋ฐ์ ์ ์์ต๋๋ค.
- ์๋ก์ด ๋ ธ๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ถ๊ฐ๋๋ฉด, ์ถ๊ฐ๋ newNode ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- DOM ์กฐ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋ ์ค ํ๋์ ๋๋ค.
์์:
// HTML: <div id="parent">
// <p>๊ธฐ์กด ์์</p>
// </div>
const parentDiv = document.getElementById('parent');
const newChildDiv = document.createElement('div');
newChildDiv.textContent = '์๋ก์ด ๋ง์ง๋ง ์์';
parentDiv.appendChild(newChildDiv);
// ๊ฒฐ๊ณผ HTML:
// <div id="parent">
// <p>๊ธฐ์กด ์์</p>
// <div>์๋ก์ด ๋ง์ง๋ง ์์</div>
// </div>
insertAdjacentElement()
- ๋ฌด์์ ์ฝ์ ํ๋๊ฐ?: ์ค์ง Element ๊ฐ์ฒด๋ง ์ฝ์ ํฉ๋๋ค. (ํ ์คํธ ๋ ธ๋๋ ์ฃผ์ ๋ ธ๋ ๋ฑ์ ์ง์ ์ฝ์ ํ ์ ์์ต๋๋ค.)
- ์ด๋์ ์ฝ์ ํ๋๊ฐ?: **๊ธฐ์ค ์์(reference element)**์ ์๋์ ์ธ ์์น์ ์ฝ์ ํฉ๋๋ค. ์ด ๋ฉ์๋๋ HTML ๋ฌธ์์ด์ ํ์ฑํ๋ insertAdjacentHTML()๊ณผ ๋ฌ๋ฆฌ, ์ด๋ฏธ ์กด์ฌํ๋ Element ๋ ธ๋๋ฅผ ์ง์ ์ฝ์ ํฉ๋๋ค.
- ๋ฌธ๋ฒ: element.insertAdjacentElement(position, newElement)
- element: ์ฝ์ ์ ๊ธฐ์ค์ด ๋ ์์.
- position: ์ฝ์ ํ ์์น๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด (๋ค ๊ฐ์ง ์ต์ : 'beforebegin', 'afterbegin', 'beforeend', 'afterend').
- newElement: ์ฝ์ ํ Element ๊ฐ์ฒด.
- ํน์ง:
- ์๋ก์ด ์์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฝ์ ๋๋ฉด, ์ฝ์ ๋ newElement ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- appendChild()๋ณด๋ค ๋ ์ ์ฐํ๊ฒ ์์๋ฅผ ์ฝ์ ํ ์ ์์ผ๋ฉฐ, ํ์ ์์๋ก ์ถ๊ฐํ๊ฑฐ๋ ์์ ์์์ ๋งจ ์/๋ค์ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์์:
// HTML: <div id="targetElement">
// <span>์๋ ์์</span>
// </div>
const targetElement = document.getElementById('targetElement');
// 1. 'beforebegin': targetElement ๋ฐ๋ก ์์ ํ์ ๋ก ์ฝ์
const elementBefore = document.createElement('p');
elementBefore.textContent = 'ํ๊ฒ ์ ํ์ ';
targetElement.insertAdjacentElement('beforebegin', elementBefore);
// <p>ํ๊ฒ ์ ํ์ </p><div id="targetElement">...</div>
// 2. 'afterbegin': targetElement ์์ ์ฒซ ๋ฒ์งธ ์์์ผ๋ก ์ฝ์
const elementAfterBegin = document.createElement('h3');
elementAfterBegin.textContent = 'ํ๊ฒ ์ ์ฒซ ์์';
targetElement.insertAdjacentElement('afterbegin', elementAfterBegin);
// <div id="targetElement"><h3>ํ๊ฒ ์ ์ฒซ ์์</h3><span>์๋ ์์</span></div>
// 3. 'beforeend': targetElement ์์ ๋ง์ง๋ง ์์์ผ๋ก ์ฝ์
const elementBeforeEnd = document.createElement('footer');
elementBeforeEnd.textContent = 'ํ๊ฒ ์ ๋ ์์';
targetElement.insertAdjacentElement('beforeend', elementBeforeEnd);
// <div id="targetElement">...<span>์๋ ์์</span><footer>ํ๊ฒ ์ ๋ ์์</footer></div>
// 4. 'afterend': targetElement ๋ฐ๋ก ๋ค์ ํ์ ๋ก ์ฝ์
const elementAfter = document.createElement('hr');
targetElement.insertAdjacentElement('afterend', elementAfter);
// <div id="targetElement">...</div><hr>
์ฃผ์ ์ฐจ์ด์ ์์ฝ
์ฝ์ ๋์ | ๋ชจ๋ ์ข ๋ฅ์ Node (Element, Text, Comment ๋ฑ) | ์ค์ง Element ๋ ธ๋๋ง |
์ฝ์ ์์น | ํธ์ถ๋ ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ผ๋ก ๊ณ ์ | ๊ธฐ์ค ์์์ ์๋์ ์ธ 4๊ฐ์ง ์์น ์ค ์ ํ |
ํธ์ถ ์ฃผ์ฒด | ๋ถ๋ชจ ์์ (parentNode.appendChild(...)) | ๊ธฐ์ค์ด ๋๋ ์์ (element.insertAdjacentElement(...)) |
์ธ์ | ์ฝ์ ํ ๋ ธ๋ 1๊ฐ | ์์น ๋ฌธ์์ด, ์ฝ์ ํ ์์ 1๊ฐ |
๋ฐํ ๊ฐ | ์ฝ์ ๋ Node | ์ฝ์ ๋ Element |
์ ์ฐ์ฑ | ์์ ์ถ๊ฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ | ํ์ ๋๋ ์์ ์์น์ ๋ํ ์ ๊ตํ ์ ์ด |
์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ง๋ ์๋ก์ด ๋ ธ๋๋ฅผ ์ด๋์ ๋ฐฐ์นํ๊ณ ์ถ์์ง, ๊ทธ๋ฆฌ๊ณ ์ฝ์ ํ๋ ค๋ ๋์์ด Element ๋ ธ๋์ธ์ง ์๋๋ฉด ๋ค๋ฅธ ์ข ๋ฅ์ ๋ ธ๋(์: ํ ์คํธ ๋ ธ๋)์ธ์ง์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. insertAdjacentElement()๋ appendChild()๋ณด๋ค ํจ์ฌ ๋ค์ํ ์์น์ ๋ ธ๋๋ฅผ ์ฝ์ ํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
insertAdjacentElement()์ append()๋ ๋ชจ๋ DOM์ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋์ด์ง๋ง, ์ด๋ค ์ข ๋ฅ์ ๋ด์ฉ์ ์ด๋์ ์ฝ์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ธ์๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋์ง์ ์ค์ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
insertAdjacentElement()
- ๋ฌด์์ ์ฝ์ ํ๋๊ฐ?: ์ค์ง Element ๊ฐ์ฒด๋ง ์ฝ์ ํฉ๋๋ค. (ํ ์คํธ ๋ฌธ์์ด์ ์ง์ ์ธ์๋ก ๋ฐ์ ์ ์์ต๋๋ค.)
- ์ด๋์ ์ฝ์ ํ๋๊ฐ?: ํน์ ๊ธฐ์ค ์์(element)์ ์๋์ ์ธ 4๊ฐ์ง ์์น(beforebegin, afterbegin, beforeend, afterend) ์ค ํ๋๋ฅผ ์ ํํ์ฌ ์ฝ์ ํฉ๋๋ค. ์ด ๋๋ฌธ์ ๊ธฐ์กด ์์์ ํ์ ๋ ธ๋(์/๋ค)๋ก ์ฝ์ ํ๊ฑฐ๋, ๊ธฐ์กด ์์์ ์์ ๋ ธ๋(๋งจ ์/๋งจ ๋ค)๋ก ์ฝ์ ํ๋ ๋ฑ ์ ๊ตํ ์์น ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ฌธ๋ฒ: element.insertAdjacentElement(position, newElement)
- element: ์ฝ์ ์ ๊ธฐ์ค์ด ๋ ์์.
- position: ์ฝ์ ํ ์์น๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด.
- newElement: ์ฝ์ ํ Element ๊ฐ์ฒด.
- ๋ฐํ ๊ฐ: ์ฝ์ ๋ Element ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- ์์:
JavaScript
// HTML: <div id="target">๊ธฐ์ค ์์</div> const target = document.getElementById('target'); const newParagraph = document.createElement('p'); newParagraph.textContent = 'ํ๊ฒ ์์ ์ฝ์ ๋ ๋จ๋ฝ'; target.insertAdjacentElement('beforebegin', newParagraph); // ๊ฒฐ๊ณผ HTML: <p>ํ๊ฒ ์์ ์ฝ์ ๋ ๋จ๋ฝ</p><div id="target">๊ธฐ์ค ์์</div>
append()
- ๋ฌด์์ ์ฝ์ ํ๋๊ฐ?: **์ฌ๋ฌ ๊ฐ์ Node ๊ฐ์ฒด (Element, Text ๋ฑ) ๋๋ ํ ์คํธ ๋ฌธ์์ด(DOMString)**์ ์ธ์๋ก ๋ฐ์ ์ ์์ต๋๋ค. ํ ์คํธ ๋ฌธ์์ด์ ์๋์ผ๋ก Text ๋ ธ๋๋ก ๋ณํ๋์ด ์ฝ์ ๋ฉ๋๋ค.
- ์ด๋์ ์ฝ์ ํ๋๊ฐ?: ํธ์ถ๋ ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ผ๋ก ์ฝ์ ํฉ๋๋ค. ์ฌ๋ฌ ์ธ์๋ฅผ ๋๊ธฐ๋ฉด ๋ชจ๋ ๋ง์ง๋ง ์์๋ค๋ก ์์๋๋ก ์ถ๊ฐ๋ฉ๋๋ค.
- ๋ฌธ๋ฒ: parentNode.append(nodeOrString1, nodeOrString2, ...)
- parentNode: ์๋ก์ด ๋ ธ๋ ๋๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํ ๋ถ๋ชจ ์์.
- nodeOrStringX: ์ถ๊ฐํ Node ๊ฐ์ฒด ๋๋ ํ ์คํธ ๋ฌธ์์ด.
- ๋ฐํ ๊ฐ: undefined๋ฅผ ๋ฐํํฉ๋๋ค.
- ์์:
JavaScript
// HTML: <ul id="myList"> // <li>์ฒซ ๋ฒ์งธ ์์ดํ </li> // </ul> const myList = document.getElementById('myList'); const newItem = document.createElement('li'); newItem.textContent = '์๋ก์ด ์์ดํ '; myList.append(newItem, '์ด๊ฒ์ ํ ์คํธ ๋ ธ๋์ ๋๋ค.', document.createElement('hr')); // ๊ฒฐ๊ณผ HTML: // <ul id="myList"> // <li>์ฒซ ๋ฒ์งธ ์์ดํ </li> // <li>์๋ก์ด ์์ดํ </li> // ์ด๊ฒ์ ํ ์คํธ ๋ ธ๋์ ๋๋ค. // <hr> // </ul>
์ฃผ์ ์ฐจ์ด์ ์์ฝ
์ฝ์ ๋์ | ์ค์ง Element ๋ ธ๋๋ง | Node (Element, Text ๋ฑ) ๋ฐ DOMString(ํ ์คํธ) ๋ชจ๋ ๊ฐ๋ฅ |
์ฝ์ ์์น | ๊ธฐ์ค ์์์ ์๋์ ์ธ 4๊ฐ์ง ์์น ์ค ์ ํ (ํ์ ๋๋ ์์) | ํธ์ถ๋ ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ผ๋ก๋ง ์ถ๊ฐ๋ฉ๋๋ค. |
ํธ์ถ ์ฃผ์ฒด | ๊ธฐ์ค์ด ๋๋ ์์ (element.insertAdjacentElement(...)) | ์๋ก์ด ์์๋ฅผ ๋ด์ ๋ถ๋ชจ ์์ (parentNode.append(...)) |
์ธ์ ๊ฐ์ | position ๋ฌธ์์ด + ์ฝ์ ํ Element ๋ ธ๋ 1๊ฐ | ์ฝ์ ํ ๋ ธ๋/๋ฌธ์์ด ์ฌ๋ฌ ๊ฐ |
๋ฐํ ๊ฐ | ์ฝ์ ๋ Element ๊ฐ์ฒด | undefined |
์ ์ฐ์ฑ | ํ์ /์์ ์์น์ ๋ํ ์ ๊ตํ ์ ์ด | ์ฌ๋ฌ ์์ ์์(ํ ์คํธ ํฌํจ)๋ฅผ ํ ๋ฒ์ ์ถ๊ฐํ๋ ๊ฐ๊ฒฐ์ฑ |
์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ง๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๊ณ ๋ คํ์ฌ ๊ฒฐ์ ํ ์ ์์ต๋๋ค:
- ํน์ ์์น์ ์ ๋ฐํ๊ฒ ์์๋ฅผ ์ฝ์ ํ๊ณ ์ถ๋ค๋ฉด (beforebegin, afterend ๋ฑ์ผ๋ก ํ์ ์์์ฒ๋ผ): insertAdjacentElement()
- ๋ถ๋ชจ ์์์ ๋งจ ๋ง์ง๋ง์ ์ฌ๋ฌ ์์ ์์๋ ํ ์คํธ๋ฅผ ํ ๋ฒ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด: append()
DOM ์์ ์กฐ์ ๋ฐฉ๋ฒ ์์ฝ
์ ๊ณตํด์ฃผ์ ์๋ฃ๋ ์น ํ์ด์ง์ DOM(Document Object Model) ์์๋ฅผ ์์ฑ, ์ฝ์ , ๊ต์ฒด, ์ ๊ฑฐํ๋ ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ณ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ ๋ํ ๊ณ ๋ ค ์ฌํญ๊ณผ ๊ฐ ๋ฐฉ๋ฒ์ ์ฅ๋จ์ ๋ ํจ๊ป ์ ์ํ๊ณ ์์ต๋๋ค.
1. ์์ฑ ๋ฐ ์ฝ์
DOM์ ์๋ก์ด ๋ด์ฉ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ฉ๋๋ค.
1.1. HTML ์ฝ๋ ์ถ๊ฐํ๊ธฐ (๋ฌธ์์ด ๋ฐฉ์)
- innerHTML:
- ํน์ ์์์ innerHTML ์์ฑ์ HTML ๋ฌธ์์ด์ ํ ๋นํ๋ฉด, ํด๋น ์์์ ๊ธฐ์กด ๋ด์ฉ์ด ๋ชจ๋ ์์ ํ ์ ๋ด์ฉ์ผ๋ก ๊ต์ฒด๋ฉ๋๋ค. ์ด๋ ์์ ๋ด ๋ชจ๋ HTML ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ ํ ์๋กญ๊ฒ ๋ ๋๋งํฉ๋๋ค.
- ์์:
JavaScript
const root = document.getElementById('root-el'); root.innerHTML = ` <div> <h2>Welcome!</h2> <p>This is all created & rendered automatically!</p> </div> `;
- ํน์ ์์์ innerHTML ์์ฑ์ HTML ๋ฌธ์์ด์ ํ ๋นํ๋ฉด, ํด๋น ์์์ ๊ธฐ์กด ๋ด์ฉ์ด ๋ชจ๋ ์์ ํ ์ ๋ด์ฉ์ผ๋ก ๊ต์ฒด๋ฉ๋๋ค. ์ด๋ ์์ ๋ด ๋ชจ๋ HTML ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ ํ ์๋กญ๊ฒ ๋ ๋๋งํฉ๋๋ค.
- insertAdjacentHTML():
- HTML ๋ฌธ์์ด์ ํ์ฑํ์ฌ DOM ๋
ธ๋๋ก ๋ณํํ ๋ค์, ํน์ ์์์ ์๋์ ์ธ ์์น์ ์ฝ์
ํฉ๋๋ค. ๊ธฐ์กด ๋ด์ฉ์ ์์ ํ ๋์ฒดํ์ง ์๊ณ ์ถ๊ฐํฉ๋๋ค.
- ์์น ์ต์
: beforebegin (์์ ์ด์ ), afterbegin (์์ ๋ฐ๋ก ์์์ ์ฒ์ ์์ ์ด์ ), beforeend (์์ ๋ฐ๋ก ์์์ ๋ง์ง๋ง ์์ ์ดํ), afterend (์์ ์ดํ).
- ์ฅ์ : DOM ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ๋ ๋๋งํ์ง ์๊ณ ํจ์จ์ ์ผ๋ก ๋ถ๋ถ๋ง ์
๋ฐ์ดํธํฉ๋๋ค.
- ์์:
JavaScript
const root = document.getElementById('root-el'); root.insertAdjacentHTML('afterbegin', ` <div> <h2>Welcome!</h2> <p>This is all created & rendered automatically!</p> </div> `);
- HTML ๋ฌธ์์ด์ ํ์ฑํ์ฌ DOM ๋
ธ๋๋ก ๋ณํํ ๋ค์, ํน์ ์์์ ์๋์ ์ธ ์์น์ ์ฝ์
ํฉ๋๋ค. ๊ธฐ์กด ๋ด์ฉ์ ์์ ํ ๋์ฒดํ์ง ์๊ณ ์ถ๊ฐํฉ๋๋ค.
1.2. DOM ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ฝ์ ํ๊ธฐ (๊ฐ์ฒด ๋ฐฉ์)
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ์ง์ DOM ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, ์ด๋ฅผ ๊ธฐ์กด DOM ํธ๋ฆฌ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ ๋๋ค.
- ์ฅ์ : ์์ฑ๋ DOM ๊ฐ์ฒด์ ์ง์ ์ ๊ทผํ์ฌ ํ๋กํผํฐ๋ฅผ ์ค์ ํ๊ฑฐ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- ๋จ์ : HTML ๋ฌธ์์ด ๋ฐฉ์๋ณด๋ค ๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ฝ์ ํ๋ ๋ฉ์๋:
- append():
- ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ผ๋ก ํ๋ ์ด์์ Node ๊ฐ์ฒด ๋๋ ํ
์คํธ ๋ฌธ์์ด์ ์ถ๊ฐํฉ๋๋ค. ํ
์คํธ ๋ฌธ์์ด์ ์๋์ผ๋ก ํ
์คํธ ๋
ธ๋๋ก ๋ณํ๋ฉ๋๋ค.
- ์์:
JavaScript
const someParagraph = document.createElement('p'); const root = document.getElementById('root-el'); root.append(someParagraph); // root์ ๋์ ์ฝ์
- ๋ธ๋ผ์ฐ์ ์ง์: ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ ์ง์๋ฉ๋๋ค. IE์์๋ appendChild()๊ฐ ์ ํธ๋ ์ ์์ต๋๋ค.
- ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ผ๋ก ํ๋ ์ด์์ Node ๊ฐ์ฒด ๋๋ ํ
์คํธ ๋ฌธ์์ด์ ์ถ๊ฐํฉ๋๋ค. ํ
์คํธ ๋ฌธ์์ด์ ์๋์ผ๋ก ํ
์คํธ ๋
ธ๋๋ก ๋ณํ๋ฉ๋๋ค.
- prepend():
- ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์์์ผ๋ก ํ๋ ์ด์์ Node ๊ฐ์ฒด ๋๋ ํ
์คํธ ๋ฌธ์์ด์ ์ถ๊ฐํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ ์ง์๋ฉ๋๋ค. IE์์๋ insertBefore()๊ฐ ์ ํธ๋ ์ ์์ต๋๋ค.
- ๋ถ๋ชจ ์์์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์์์ผ๋ก ํ๋ ์ด์์ Node ๊ฐ์ฒด ๋๋ ํ
์คํธ ๋ฌธ์์ด์ ์ถ๊ฐํฉ๋๋ค.
- before() / after():
- before()๋ ๋์ ์์์ ๋ฐ๋ก ์์ ํ์ ์์๋ก ์๋ก์ด ๋
ธ๋๋ ํ
์คํธ๋ฅผ ์ฝ์
ํฉ๋๋ค.
- after()๋ ๋์ ์์์ ๋ฐ๋ก ๋ค์ ํ์ ์์๋ก ์๋ก์ด ๋
ธ๋๋ ํ
์คํธ๋ฅผ ์ฝ์
ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง๋ง, IE์ Safari๋ ์ง์ํ์ง ์์ต๋๋ค. IE์์๋ insertBefore() ๋๋ insertAdjacentElement()๋ฅผ ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- before()๋ ๋์ ์์์ ๋ฐ๋ก ์์ ํ์ ์์๋ก ์๋ก์ด ๋
ธ๋๋ ํ
์คํธ๋ฅผ ์ฝ์
ํฉ๋๋ค.
์ค์ ์ฐธ๊ณ ์ฌํญ (์ฝ์ ์): ์์๋ฅผ ์ฝ์ ํ ๋, ์ด๋ฏธ DOM์ ์ฝ์ ๋ ์์๋ฅผ ๋ค์ ์ฝ์ ํ๋ฉด ํด๋น ์์๊ฐ ์๋ก์ด ์์น๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค. ์์๊ฐ ๋ณต์ฌ๋๋ ๊ฒ์ด ์๋๋๋ค. ์์๋ฅผ ๋ณต์ฌํ๋ ค๋ฉด someElement.cloneNode(true)์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
2. ๊ต์ฒด (Replace)
DOM์ ๊ธฐ์กด ์์๋ฅผ ๋ค๋ฅธ ์์๋ก ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- replaceWith():
- ๋์ ์์๋ฅผ ๋ค๋ฅธ ๋
ธ๋๋ ํ
์คํธ ๋ฌธ์์ด๋ก ๊ต์ฒดํฉ๋๋ค. ์ฌ์ฉํ๊ธฐ ๊ฐํธํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ์ ์ ํ ๋ธ๋ผ์ฐ์ ์ง์์ ์ ๊ณตํ์ง๋ง, IE๋ ์์ธ์
๋๋ค.
- ๋์ ์์๋ฅผ ๋ค๋ฅธ ๋
ธ๋๋ ํ
์คํธ ๋ฌธ์์ด๋ก ๊ต์ฒดํฉ๋๋ค. ์ฌ์ฉํ๊ธฐ ๊ฐํธํฉ๋๋ค.
- replaceChild():
- ๋ถ๋ชจ ์์์ ์์ ๋
ธ๋ ์ค ํ๋๋ฅผ ๋ค๋ฅธ ๋
ธ๋๋ก ๊ต์ฒดํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ์ง์์ ์ ๊ณตํ์ง๋ง, replaceWith()๋ณด๋ค ์ฝ๋๋ฅผ ๋ ๋ง์ด ์์ฑํด์ผ ํฉ๋๋ค. IE๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
- ๋ถ๋ชจ ์์์ ์์ ๋
ธ๋ ์ค ํ๋๋ฅผ ๋ค๋ฅธ ๋
ธ๋๋ก ๊ต์ฒดํฉ๋๋ค.
3. ์ ๊ฑฐ (Remove)
DOM์์ ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- someElement.innerHTML = '':
- someElement ๋ด๋ถ์ ๋ชจ๋ HTML ๋ด์ฉ์ ๋น์์ ๋ ๋๋ง๋ ๋ชจ๋ ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- someElement ๋ด๋ถ์ ๋ชจ๋ HTML ๋ด์ฉ์ ๋น์์ ๋ ๋๋ง๋ ๋ชจ๋ ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- someElement.remove():
- DOM์์ ๋จ์ผ ์์(someElement)๋ฅผ ์ง์ ์ ๊ฑฐํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ํ๋ฅญํ์ง๋ง IE๋ ์ง์ํ์ง ์์ต๋๋ค. IE์์๋ removeChild()๋ฅผ ๋์ ์ฌ์ฉํฉ๋๋ค.
- DOM์์ ๋จ์ผ ์์(someElement)๋ฅผ ์ง์ ์ ๊ฑฐํฉ๋๋ค.
- someElement.parentNode.removeChild(someElement):
- ๋ถ๋ชจ ์์์์ ์ ๊ณต๋ ์์ ์์(someElement)๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ์ง์์ ์ ๊ณตํ์ง๋ง, remove()๋ณด๋ค ๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
- ๋ถ๋ชจ ์์์์ ์ ๊ณต๋ ์์ ์์(someElement)๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
4. ํ ์คํธ ๋ ธ๋ ์ฒ๋ฆฌ
ํ ์คํธ ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ์ฝ์ ํ๋ ํน๋ณํ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
- someElement.textContent = '...':
- ํน์ ์์์ textContent ์์ฑ์ ๋ฌธ์์ด์ ํ ๋นํ๋ฉด, ํด๋น ์์์ ๋ชจ๋ ๊ธฐ์กด ๋ด์ฉ์ ์ง์ฐ๊ณ ์๋ก์ด ํ
์คํธ ๋
ธ๋๋ฅผ ์์ฑํ์ฌ ์ฝ์
ํฉ๋๋ค.
- ์์: someElement.textContent = 'Hi there!';
- ํน์ ์์์ textContent ์์ฑ์ ๋ฌธ์์ด์ ํ ๋นํ๋ฉด, ํด๋น ์์์ ๋ชจ๋ ๊ธฐ์กด ๋ด์ฉ์ ์ง์ฐ๊ณ ์๋ก์ด ํ
์คํธ ๋
ธ๋๋ฅผ ์์ฑํ์ฌ ์ฝ์
ํฉ๋๋ค.
- ๊ธฐ์กด ํ
์คํธ์ ์ถ๊ฐ:
- someElement.textContent = someElement.textContent + 'More text!'; ์ ๊ฐ์ด ๊ธฐ์กด textContent์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ์ฌ ํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
'๐ป FE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์กฐ์ ํ๊ธฐ ์ํด Effect๋ฅผ ์ฐ์ง ๋ง์ธ์ (0) | 2025.05.24 |
---|---|
์์ฑ! (0) | 2025.05.16 |
children, childNodes (0) | 2025.05.16 |
querySelectorAll('li'), getElementsByTagName('li') (0) | 2025.05.14 |
์์ฑ , ํ๋กํผํฐ (0) | 2025.05.14 |