DOM ์กฐ์์ ์๋ก์ด ๋ ธ๋๋ฅผ ์์ฑํ์ฌ DOM์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋ ธ๋๋ฅผ ์ญ์ ๋๋ ๊ต์ฒดํ๋ ๊ฒ์ ๋งํฉ๋๋ค. DOM ์กฐ์์ ์ํด DOM์ ์๋ก์ด ๋ ธ๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ญ์ ๋๋ฉด ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๊ฐ ๋ฐ์ํ๋ ์์ธ์ด ๋๋ฏ๋ก ์ฑ๋ฅ์ ์ํฅ์ ์ค๋๋ค. ๋ณต์กํ ์ฝํ ์ธ ๋ฅผ ๋ค๋ฃจ๋ DOM ์กฐ์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ฃผ์ํด์ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค.
Element.prototype.innerHTML ํ๋กํผํฐ๋ setter์ getter ๋ชจ๋ ์กด์ฌํ๋ ์ ๊ทผ์ ํ๋กํผํฐ๋ก์ ์์ ๋ ธ๋์ HTML ๋งํฌ์ ์ ์ทจ๋ํ๊ฑฐ๋ ๋ณ๊ฒฝํฉ๋๋ค.
[์์ 39-43]
<html>
<body>
<ul id="fruits">
<li class="apple">Apple</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// ๋
ธ๋ ์ถ๊ฐ
$fruits.innerHTML += '<li class="banana">Banana</li>';
// ๋
ธ๋ ๊ต์ฒด
$fruits.innerHTML = '<li class="orange">Orange</li>';
// ๋
ธ๋ ์ญ์
$fruits.innerHTML = '';
</script>
</html>
textContent ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ฉด HTML ๋งํฌ์ ์ ๋ฌด์ํ๊ณ ํ ์คํธ๋ง ๋ฐํํ์ง๋ง innerHTML ํ๋กํผํฐ๋ HTML ๋งํฌ์ ์ด ํฌํจ๋ ๋ฌธ์์ด ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
innerHTML ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ DOM ์กฐ์์ ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด๋ผ๋ ์ฅ์ ์ด ์์ง๋ง ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ
์ ์ทจ์ฝํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. HTML ๋งํฌ์
๋ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์
์ฑ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด ํ์ฑ ๊ณผ์ ์์ ๊ทธ๋๋ก ์คํ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
- innerHTML ๋จ์ -ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ ์ทจ์ฝ -์์๋ ธ๋์ ํ ๋นํ ๊ฒฝ์ฐ ๊ธฐ์กด ์์๋ ธ๋ ๋ชจ๋ ์์์ ์ ๊ฑฐํ๊ณ ํ ๋น -๋ณต์กํ ์์๋ฅผ ์๋กญ๊ฒ ์ถ๊ฐํ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค
Element.prototype.insertAdjacentHTML(position, DOMString) ๋ฉ์๋๋ ๊ธฐ์กด ์์๋ฅผ ์ ๊ฑฐํ์ง ์์ผ๋ฉด์ ์์น๋ฅผ ์ง์ ํด ์๋ก์ด ์์๋ฅผ ์ฝ์ ํฉ๋๋ค.
insertAdjacentHTML ๋๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ HTML ๋งํฌ์ ๋ฌธ์์ด์ ํ์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ ์์ฑ๋ ๋ ธ๋๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ์์น์ ์ฝ์ ํ์ฌ DOM์ ๋ฐ์ํฉ๋๋ค.
๊ธฐ์ค์ ์ด ๋๋ ์์์ ๋ฐ๋ผ ์์น๋ฅผ ๋ํ๋ ๋๋ค.
- 'beforebegin': ์์์ ์
- 'afterbegin': ์์ ์ฒซ๋ฒ์งธ ์์์ ์, ์์ ๋ด๋ถ์ ์ฒซ๋ฒ์งธ
- 'beforeend': ์์ ๋ง์ง๋ง ์์ ๋ค, ์์ ๋ด๋ถ์ ๋ง์ง๋ง
- 'afterend': ์์์ ๋ค
๐ insertAdjacentHTML ๋ฉ์๋๋ HTML ๋งํฌ์ ๋ฌธ์์ด์ ํ์ฑํ๋ฏ๋ก ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ค๋ ์ ์ ๋์ผํฉ๋๋ค. innerHTML ํ๋กํผํฐ๋ณด๋ค ํจ์จ์ ์ด๊ณ ๋น ๋ฆ ๋๋ค.
[์์ 39-50]
<html>
<body>
<!-- beforebegin -->
<div id="foo">
<!-- afterbegin -->
text
<!-- beforeend -->
</div>
<!-- afterend -->
</body>
<script>
const $foo = document.getElementById('foo');
$foo.insertAdjacentHTML('beforebegin', '<p>beforebegin</p>');
$foo.insertAdjacentHTML('afterbegin', '<p>afterbegin</p>');
$foo.insertAdjacentHTML('beforeend', '<p>beforeend</p>');
$foo.insertAdjacentHTML('afterend', '<p>afterend</p>');
</script>
</html>
[์์ 39-51]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// 1. ์์ ๋
ธ๋ ์์ฑ
const $li = document.createElement('li');
// 2. ํ
์คํธ ๋
ธ๋ ์์ฑ
const textNode = document.createTextNode('Banana');
// 3. ํ
์คํธ ๋
ธ๋๋ฅผ $li ์์ ๋
ธ๋์ ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$li.appendChild(textNode);
// 4. $li ์์ ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$fruits.appendChild($li);
</script>
</html>
DOM์ ๋ ธ๋๋ฅผ ์ง์ ์์ฑ/์ฝ์ /์ญ์ /์นํํ๋ ๋ฉ์๋๋ ์ ๊ณตํฉ๋๋ค.
- ๋ ธ๋์ ์์ฑ๊ณผ ์ถ๊ฐ
-
์์ ๋ ธ๋ ์์ฑ: ํ๊ทธ ์ด๋ฆ์ ๋ํ๋ด๋ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
-
ํ ์คํธ ๋ ธ๋ ์์ฑ: ํ ์คํธ ๋ ธ๋ ๊ฐ์ผ๋ก ์ฌ์ฉํ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
-
ํ ์คํธ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋์ ์์ ๋ ธ๋๋ก ์ถ๊ฐ: appendChild() ์ฌ์ฉํด ๋งค๊ฐ๋ณ์ childNode์๊ฒ ์ธ์๋ก ์ ๋ฌํ ๋ ธ๋๋ฅผ ๋ฉ์๋ ํธ์ถํ ๋ ธ๋์ ๋ง์ง๋ง ์์ ๋ ธ๋๋ก ์ถ๊ฐํฉ๋๋ค.
-
์์ ๋ ธ๋๋ฅผ DOM์ ์ถ๊ฐ: ์ฐ๊ฒฐํ ์์ ๋ ธ๋๋ฅผ ๋ง์ง๋ง ์์ ์์๋ก ์ถ๊ฐํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋กญ๊ฒ์์ฑํ ์์ ๋ ธ๋๊ฐ DOM์ ์ถ๊ฐ ๋ฉ๋๋ค.
[์์ 39-51]
<html>
<body>
<ul id="fruits"></ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// DocumentFragment ๋
ธ๋ ์์ฑ
const $fragment = document.createDocumentFragment();
['Apple', 'Banana', 'Orange'].forEach(text => {
// 1. ์์ ๋
ธ๋ ์์ฑ
const $li = document.createElement('li');
// 2. ํ
์คํธ ๋
ธ๋ ์์ฑ
const textNode = document.createTextNode(text);
// 3. ํ
์คํธ ๋
ธ๋๋ฅผ $li ์์ ๋
ธ๋์ ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$li.appendChild(textNode);
// 4. $li ์์ ๋
ธ๋๋ฅผ DocumentFragment ๋
ธ๋์ ๋ง์ง๋ง ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$fragment.appendChild($li);
});
// 5. DocumentFragment ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$fruits.appendChild($fragment);
</script>
</html>
๋จผ์ DocumentFragment ๋ ธ๋๋ฅผ ์์ฑํ๊ณ DOM์ ์ถ๊ฐํ ์์ ๋ ธ๋๋ฅผ ์์ฑํ์ฌ DocumentFragment ๋ ธ๋์ ์์ ๋ ธ๋๋ก ์ถ๊ฐํ ๋ค์, DocumentFragment ๋ ธ๋๋ฅผ ๊ธฐ์กด DOM์ ์ถ๊ฐํฉ๋๋ค.
์ด๋, ์ค์ ๋ก DOM ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ๊ฒ์ ํ ๋ฒ๋ฟ์ด๋ฉฐ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ ํ ๋ฒ๋ง ์คํํฉ๋๋ค. DOM์ ์ฌ๋ฌ๋ฒ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๊ฐ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํ ์ ์ผ๊ธฐ์ํต๋๋ค.DOM์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋์ ๋น์ฉ์ด ๋๋ ์ฒ๋ฆฌ์ด๋ฏ๋ก ๊ฐ๊ธ์ ํ์๋ฅผ ์ค์ด๋ ํธ์ด ์ข์ต๋๋ค. ๋ฐ๋ผ์, ์ฌ๋ฌ ๊ฐ์ ์์ ๋ ธ๋๋ฅผ DOM์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ DocumentFragment ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ ๋๋ค.
๋ง์ง๋ง ๋ ธ๋๋ก ์ถ๊ฐ
Node.prototype.appendChild ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ ธ๋๋ฅผ ์์ ์ ํธ์ถํ ๋ ธ๋์ ๋ง์ง๋ง ์์ ๋ ธ๋๋ก DOM์ ์ถ๊ฐํฉ๋๋ค. ๋จ, ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์์น๋ฅผ ์ง์ ํ ์ ์๊ณ ์ธ์ ๋ ๋ง์ง๋ง ์์ ๋ ธ๋๋ก ์ถ๊ฐํฉ๋๋ค.
[์์ 39-62]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
<li>Banana</li>
</ul>
</body>
<script>
// ์์ ๋
ธ๋ ์์ฑ
const $li = document.createElement('li');
// ํ
์คํธ ๋
ธ๋๋ฅผ $li ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$li.appendChild(document.createTextNode('Orange'));
// $li ์์ ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์ ๋
ธ๋๋ก ์ถ๊ฐ
document.getElementById('fruits').appendChild($li);
</script>
</html>
์ง์ ํ ์์น์ ๋ ธ๋ ์ฝ์
Node.prototype.insertBefore(newNode, childNode) ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ ธ๋๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ ธ๋ ์์ ์ฝ์ ํฉ๋๋ค.
[์์ 39-63]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
<li>Banana</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// ์์ ๋
ธ๋ ์์ฑ
const $li = document.createElement('li');
// ํ
์คํธ ๋
ธ๋๋ฅผ $li ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์ ๋
ธ๋๋ก ์ถ๊ฐ
$li.appendChild(document.createTextNode('Orange'));
// $li ์์ ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์ ์์ ์์ ์ฝ์
$fruits.insertBefore($li, $fruits.lastElementChild);
// Apple - Orange - Banana
</script>
</html>
DOM์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ ธ๋๋ฅผ appendChild ๋๋ insertBefore ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ DOM์ ๋ค์ ์ถ๊ฐํ๋ฉด ํ์ฌ ์์น์์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ก์ด ์์น์ ๋ ธ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ฆ, ๋ ธ๋๊ฐ ์ด๋ํฉ๋๋ค.
[์์ 39-66]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
<li>Banana</li>
<li>Orange</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// ์ด๋ฏธ ์กด์ฌํ๋ ์์ ๋
ธ๋๋ฅผ ์ทจ๋
const [$apple, $banana, ] = $fruits.children;
// ์ด๋ฏธ ์กด์ฌํ๋ $apple ์์ ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ๋
ธ๋๋ก ์ด๋
$fruits.appendChild($apple); // Banana - Orange - Apple
// ์ด๋ฏธ ์กด์ฌํ๋ $banana ์์ ๋
ธ๋๋ฅผ #fruits ์์์ ๋ง์ง๋ง ์์ ๋
ธ๋ ์์ผ๋ก ์ด๋
$fruits.insertBefore($banana, $fruits.lastElementChild);
// Orange - Banana - Apple
</script>
</html>
Node.prototype.cloneNode([deep: true | false]) ๋ฉ์๋๋ ๋ ธ๋์ ์ฌ๋ณธ์ ์์ฑํ์ฌ ๋ฐํํฉ๋๋ค. ๋งค๊ฐ๋ณ์ deep์ true ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋ ธ๋๋ฅผ ๊น์ ๋ณต์ฌํ์ฌ ์์ ๋ ธ๋๊ฐ ํฌํจ๋ ์ฌ๋ณธ์ ์์ฑํ๊ณ , false๋ฅผ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ ์๋ตํ๋ฉด ์์ ๋ณต์ฌํ์ฌ ๋ ธ๋ ์์ ๋ง์ ์ฌ๋ณธ์ ์์ฑํฉ๋๋ค. ์์ ๋ณต์ฌ๋ ์์ ๋ ธ๋๋ฅผ ๋ณต์ฌํ์ง ์์ ํ ์คํธ ๋ ธ๋๋ ์์ต๋๋ค.
[์์ 39-67]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
const $apple = $fruits.firstElementChild;
// $apple ์์๋ฅผ ์์ ๋ณต์ฌํ์ฌ ์ฌ๋ณธ์ ์์ฑ. ํ
์คํธ ๋
ธ๋๊ฐ ์๋ ์ฌ๋ณธ์ด ์์ฑ๋๋ค.
const $shallowClone = $apple.cloneNode();
// ์ฌ๋ณธ ์์ ๋
ธ๋์ ํ
์คํธ ์ถ๊ฐ
$shallowClone.textContent = 'Banana';
// ์ฌ๋ณธ ์์ ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ๋
ธ๋๋ก ์ถ๊ฐ
$fruits.appendChild($shallowClone);
// #fruits ์์๋ฅผ ๊น์ ๋ณต์ฌํ์ฌ ๋ชจ๋ ์์ ๋
ธ๋๊ฐ ํฌํจ๋ ์ฌ๋ณธ์ ์์ฑ
const $deepClone = $fruits.cloneNode(true);
// ์ฌ๋ณธ ์์ ๋
ธ๋๋ฅผ #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ๋
ธ๋๋ก ์ถ๊ฐ
$fruits.appendChild($deepClone);
</script>
</html>
Node.prototype.replaceChild(newChild, oldChild) ๋ฉ์๋๋ ์์ ์ ํธ์ถํ ๋ ธ๋์ ์์ ๋ ธ๋๋ฅผ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ต์ฒดํฉ๋๋ค. ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ต์ฒดํ ์๋ก์ด ๋ ธ๋๋ฅผ ์ธ์๋ก ์ ๋ฌ, ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ด๋ฏธ ์กด์ฌํ๋ ๊ต์ฒด๋ ๋ ธ๋๋ฅผ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค. ๋๋ฒ์งธ ์ธ์๋ ํธ์ถํ ๋ ธ๋์ ์์๋ ธ๋์ฌ์ผํฉ๋๋ค.
[์์ 39-68]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// ๊ธฐ์กด ๋
ธ๋์ ๊ต์ฒดํ ์์ ๋
ธ๋๋ฅผ ์์ฑ
const $newChild = document.createElement('li');
$newChild.textContent = 'Banana';
// #fruits ์์ ๋
ธ๋์ ์ฒซ ๋ฒ์งธ ์์ ์์ ๋
ธ๋๋ฅผ $newChild ์์ ๋
ธ๋๋ก ๊ต์ฒด
$fruits.replaceChild($newChild, $fruits.firstElementChild);
</script>
</html>
Node.prototype.removeChild(child) ๋ฉ์๋๋ child ๋งค๊ฐ๋ณ์์ ์ธ์๋ก ์ ๋ฌํ ๋ ธ๋๋ฅผ DOM์์ ์ญ์ ํฉ๋๋ค.
[์์ 39-69]
<html>
<body>
<ul id="fruits">
<li>Apple</li>
<li>Banana</li>
</ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// #fruits ์์ ๋
ธ๋์ ๋ง์ง๋ง ์์๋ฅผ DOM์์ ์ญ์
$fruits.removeChild($fruits.lastElementChild);
</script>
</html>
HTML ๋ฌธ์์ ๊ตฌ์ฑ ์์์ธ HTML ์์๋ ์ฌ๋ฌ ๊ฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ดํธ๋ฆฌ๋ทฐํธ(id, class, style, title, lang, tabindex, draggable, hidden ๋ฑ), ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ดํธ๋ฆฌ๋ทฐํธ(onclick, onchange, onfocus, onblur, oninput, onkeypress, onkeydown, onkeyup, onload ๋ฑ) ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
HTML ์์์ ๋์์ ์ ์ดํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋๋ถ๋ถ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ ๋ชจ๋ HTML ์์์์ ์ฌ์ฉ๋ ์ ์์ง๋ง, type, value, checked ์ดํธ๋ฆฌ๋ทฐํธ๋ input ์์์๋ง ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
HTML ๋ฌธ์๊ฐ ํ์ฑ๋ ๋ HTML ์์์ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์ดํธ๋ฆฌ๋ทฐํธ ๋
ธ๋๋ก ๋ณํ๋์ด ์์ ๋
ธ๋์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
๐ attributes ํ๋กํผํฐ๋ getter๋ง ์กด์ฌํ๋ ์ฝ๊ธฐ ์ ์ฉ ์ ๊ทผ์ ์์ฑ์ด๋ฏ๋ก ๊ฐ์ ์ป์ ์ ์์ง๋ง ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค.
HTML ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์ฐธ์กฐํ๋ ค๋ฉด Element.prototype.getAttribute(attributeName) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , HTML ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด Element.prototype.setAttribute(attributeName, attributeValue) ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
[์์ 39-72]
<html>
<body>
<input id="user" type="text" value="ungmo2">
<script>
const $input = document.getElementById('user');
// value ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์ทจ๋
const inputValue = $input.getAttribute('value');
console.log(inputValue); // ungmo2
// value ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ๋ณ๊ฒฝ
$input.setAttribute('value', 'foo');
console.log($input.getAttribute('value')); // foo
</script>
</body>
</html>
-
Element.prototype.hasAttribute(attributeName) : ํน์ ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์กด์ฌํ๋์ง ํ์ธ
-
Element.prototype.removeAttribute(attributeName) : ํน์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ญ์
HTML ์ดํธ๋ฆฌ๋ทฐํธ์ ์ญํ ์ HTML ์์์ ์ด๊ธฐ ์ํ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค. ์ฆ, HTML ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ HTML ์์์ ์ด๊ธฐ ์ํ๋ฅผ ์๋ฏธํ๋ฉฐ ์ด๋ ๋ณํ์ง ์๋๋ค. value ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ฐ๊พธ๋๋ผ๋ ์ค์ ๋ก ๋ฐ์๋์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
ํ์ง๋ง ์ฒซ ๋ ๋๋ง ์ดํ
์ฌ์ฉ์๊ฐ input ์์์ ๋ฌด์ธ๊ฐ๋ฅผ ์
๋ ฅํ๊ธฐ ์์ํ๋ฉด ์ํฉ์ด ๋ฌ๋ผ์ง๋๋ค. ์์ ๋
ธ๋๋ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
input ์์๋ ์ฌ์ฉ์์ ์
๋ ฅ์ ์ํด ๋ณํํ๋, ์ด์์๋ ๊ฒ์
๋๋ค.
์์ ๋ ธ๋๋ 2๊ฐ์ ์ํ, ์ฆ ์ด๊ธฐ ์ํ์ ์ต์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค. ์์ ๋ ธ๋์ ์ด๊ธฐ ์ํ๋ ์ดํธ๋ฆฌ๋ทฐํธ ๋ ธ๋๊ฐ ๊ด๋ฆฌํ๋ฉฐ, ์์ ๋ ธ๋์ ์ต์ ์ํ๋ DOMํ๋กํผํฐ๊ฐ ๊ด๋ฆฌํฉ๋๋ค.
[์์ 39-75]
<html>
<body>
<input id="user" type="text" value="ungmo2">
<script>
const $input = document.getElementById('user');
// attributes ํ๋กํผํฐ์ ์ ์ฅ๋ value ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ
console.log($input.getAttribute('value')); // ungmo2
// ์์ ๋
ธ๋์ value ํ๋กํผํฐ์ ์ ์ฅ๋ value ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ
console.log($input.value); // ungmo2
// attributes ํ๋กํผํฐ์ ์ ์ฅ๋ value ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์ทจ๋ํ๋ค. ๊ฒฐ๊ณผ๋ ์ธ์ ๋ ๋์ผํ๋ค.
document.getElementById('user').getAttribute('value'); // ungmo2
</script>
</body>
</html>
-
HTML ์ดํธ๋ฆฌ๋ทฐํธ์ DOM ํ๋กํผํฐ์ ๋์ ๊ด๊ณ
- id ์ดํธ๋ฆฌ๋ทฐํธ์ id ํ๋กํผํฐ๋ 1:1๋ก ๋์ํ๋ฉฐ, ๋์ผํ ๊ฐ์ผ๋ก์ฐ๋ํ๋ค.
- input ์์์ value ์ดํธ๋ฆฌ๋ทฐํธ์ value ํ๋กํผํฐ๋ 1:1๋ก ๋์ํ๋ฉฐ, ํ์ง๋ง value ์ดํธ๋ฆฌ๋ทฐํธ๋ ์ด๊ธฐ์ํ๋ฅผ, value ํ๋กํผํฐ๋ ์ต์ ์ํ๋ฅผ ๊ฐ๋๋ค.
- class ์ดํธ๋ฆฌ๋ทฐํธ์ className, classLis ํ๋กํผํฐ๋ ๋์ํ๋ค.
- for ์ดํธ๋ฆฌ๋ทฐํธ์ htmlFor ํ๋กํผํฐ์ 1:1 ๋์ํ๋ค.
- textContent ํ๋กํผํฐ๋ ๋์ํ๋ ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค.
- DOM ํ๋กํผํฐ์ ๊ฐ์ ํ์ getAttribute ๋ฉ์๋๋ก ์ทจ๋ํ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์ธ์ ๋ ๋ฌธ์์ด์ด๋ค. ํ์ง๋ง DOM ํ๋กํผํฐ๋ก ์ทจ๋ํ ์ต์ ์ํ ๊ฐ์ ๋ฌธ์์ด์ด ์๋ ์๋ ์์ต๋๋ค.(checkbox ์์์ checked ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ๋ฌธ์์ด์ด์ง๋ง checkd ํ๋กํผํฐ ๊ฐ์ ๋ถ๋ฆฌ์ธํ์ )
data ์ดํธ๋ฆฌ๋ทฐํธ dataset ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด HTML ์์์ ์ ์ํ ์ฌ์ฉ์ ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์๋ค. data ์ดํธ๋ฆฌ๋ทฐํธ๋ 'data-user-id', 'data-role'๊ณผ ๊ฐ์ด data-
์ ๋์ฌ ๋ค์์ ์์์ ์ด๋ฆ์ ๋ถ์ฌ ์ฌ์ฉํฉ๋๋ค. dataset ํ๋กํผํฐ์ ์ถ๊ฐํ ํ๋กํผํฐ ํค๋ ์นด๋ฉ ์ผ์ด์ค๋ก ๋์ด์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์นด๋ฉ์ผ์ด์ค๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
('data-user-id' -> userId)
[์์ 39-83]
<html>
<body>
<ul class="users">
<li id="1" data-user-id="7621" data-role="admin">lee</li>
<li id="2" data-user-id="9524" data-role="subscriber">kim</li>
</ul>
<script>
const users = [...document.querySelector('.users').children];
// user-id๊ฐ '7621'์ธ ์์ ๋
ธ๋๋ฅผ ์ทจ๋ํ๋ค.
const user = users.find(user => user.dataset.userId === '7621');
// user-id๊ฐ '7621'์ธ ์์ ๋
ธ๋์์ data-role์ ๊ฐ์ ์ทจ๋ํ๋ค.
console.log(user.dataset.role); // "admin"
// user-id๊ฐ '7621'์ธ ์์ ๋
ธ๋์ data-role์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
user.dataset.role = "subscriber";
console.log(user.dataset.role); // "subscriber"
</script>
</body>
</html>
<html>
<body>
<ul class="users">
<li id="1" data-user-id="7621" data-role="admin">lee</li>
<li id="2" data-user-id="9524" data-role="subscriber">kim</li>
</ul>
<script>
const users = [...document.querySelector('.users').children];
users[0].style.color = 'blue';
users[0].style['border-color'] = 'blue';
users[1].style['border'] = '1px solid';
users[1].style.borderColor = 'green';
</script>
</body>
</html>
- css ํ๋กํผํฐ๋ ์ผ๋ฐฅ ์ผ์ด์ค๋ฅผ ๋ฐ๋ฅธ๋ค ['background-color']
- ๊ฐ์ฒด ํ๋กํผํฐ๋ ์นด๋ฉ์ผ์ด์ค backgroundColor
- css ํ๋กํผํฐ ๊ฐ์ ๋จ์๊ฐ ์์ ๊ฒฝ์ฐ ์ง์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฉ์ด ์๋ฉ๋๋ค.
className ํ๋กํผํฐ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ฏ๋ก ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ์ฌ๋ฌ ๊ฐ์ ํด๋์ค๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ๋ค๋ฃจ๊ธฐ ๋ถํธํฉ๋๋ค. class Name ๋ณด๋ค classList ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- DOMTokenList ์ ์ฉํ ๋ฉ์๋
-
add - ์ธ์๋ก ์ ๋ฌํ 1๊ฐ ์ด์์ ๋ฌธ์์ด์ class ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ผ๋ก ์ถ๊ฐํ๋ค.
-
remove - ์ธ์๋ก ์ ๋ฌํ 1๊ฐ ์ด์์ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ํด๋์ค๋ฅผ class ์ดํธ๋ฆฌ๋ทฐํธ์์ ์ญ์ ํ๋ค ์์ผ๋ฉด ์๋ฌ ์์ด ๋ฌด์๋๋ค.
-
item - ์ธ์๋ก ์ ๋ฌํ index์ ํด๋นํ๋ ํด๋์ค๋ฅผ class ์ดํธ๋ฆฌ๋ทฐํธ์์ ๋ฐํํ๊ณ index๊ฐ 1์ด๋ฉด ๋ ๋ฒ์งธ ํด๋์ค๋ฅผ ๋ฐํํ๋ค.
-
contains(className) - ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ํด๋์ค๊ฐ class ์ดํธ๋ฆฌ๋ทฐํธ์ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค.
-
replace(className) - class ์ดํธ๋ฆฌ๋ทฐํธ์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ค.
-
toggle(className) - class ์ดํธ๋ฆฌ๋ทฐํธ์ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด๊ณผ ์ผ์ฐจํ๋ ํด๋์ค ์กด์ฌํ๋ฉด ์ ๊ฑฐํ๊ณ , ์์ผ๋ฉด ์ถ๊ฐํ๋ค.
-