- 39μ₯ μ΄λ²€νΈ
- 39.6 DOM μ‘°μ
DOM μ‘°μμ μλ‘μ΄ λ
Έλλ₯Ό μμ±νμ¬ DOMμ μΆκ°νκ±°λ κΈ°μ‘΄ λ
Έλλ₯Ό μμ λλ κ΅μ²΄νλ κ².
DOM μ‘°μμ μν΄ DOMμ μλ‘μ΄ λ
Έλκ° μΆκ°λκ±°λ μμ λλ©΄ 리νλ‘μ°μ 리νμΈνΈκ° λ°μνλ μμΈμ΄ λλ―λ‘ μ±λ₯μ μν₯μ μ€. 볡μ‘ν μ½ν
μΈ λ₯Ό λ€λ£¨λ DOM μ‘°μμ μ±λ₯ μ΅μ νλ₯Ό μν΄ μ£Όμν΄μ λ€λ£¨μ΄μΌ ν¨.
Element.prototype.innerHTML νλ‘νΌν°λ setter, getter λͺ¨λ μ‘΄μ¬νλ μ κ·Όμ νλ‘νΌν°λ‘μ μμ λ Έλμ HTML λ§ν¬μ μ μ·¨λνκ±°λ λ³κ²½ν¨. μμ λ Έλμ innerHTML νλ‘νΌν°λ₯Ό μ°Έμ‘°νλ©΄ μμ λ Έλμ μ½ν μΈ μμ λ΄μ ν¬ν¨λ λͺ¨λ HTML λ§ν¬μ μ λ¬Έμμ΄λ‘ λ°νν¨
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello <span>world!</span></div>
</body>
<script>
// #foo μμμ μ½ν
μΈ μμ λ΄μ HTML λ§ν¬μ
μ λ¬Έμμ΄λ‘ μ·¨λνλ€.
console.log(document.getElementById('foo').innerHTML);
// "Hello <span>world!</span>"
</script>
</html>textContent νλ‘νΌν°λ HTML λ§ν¬μ
무μνκ³ ν
μ€νΈλ§ λ°ν
innerHTML νλ‘νΌν°λ HTML λ§ν¬μ
μ΄ ν¬ν¨λ λ¬Έμμ΄ κ·Έλλ‘ λ°ν
μμ λ
Έλμ innerHTML νλ‘νΌν°μ λ¬Έμμ΄μ ν λΉνλ©΄ μμ λ
Έλμ λͺ¨λ μμ λ
Έλκ° μ κ±°λκ³
ν λΉν λ¬Έμμ΄μ ν¬ν¨λμ΄ μλ HTML λ§ν¬μ
μ΄ νμ±λμ΄ μμ λ
Έλμ μμ λ
Έλλ‘ DOMμ λ°μλ¨
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello <span>world!</span></div>
</body>
<script>
// HTML λ§ν¬μ
μ΄ νμ±λμ΄ μμ λ
Έλμ μμ λ
Έλλ‘ DOMμ λ°μλλ€.
document.getElementById('foo').innerHTML = 'Hi <span>there!</span>';
</script>
</html>μμ λ
Έλμ innerHTML νλ‘νΌν°μ ν λΉν HTML λ§ν¬μ
λ¬Έμμ΄μ λ λλ§ μμ§μ μν΄ νμ±λμ΄
μμ λ
Έλμ μμμΌλ‘ DOMμ λ°μλ¨
<!DOCTYPE html>
<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>μ¬μ©μλ‘λΆν° μ
λ ₯λ°μ λ°μ΄ν°(untrusted input data)λ₯Ό κ·Έλλ‘ innerHTML νλ‘νΌν°μ ν λΉνλ κ²μ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν
곡격μ μ·¨μ½νλ―λ‘ μνν¨. λ§ν¬μ
λ΄μ μ
μ± μ½λκ° μμΌλ©΄ νμ± κ³Όμ μμ κ·Έλλ‘ μ€νλκΈ° λλ¬Έ.
μ€ν¬λ¦½νΈ νκ·Έ μ½μ νμ¬ μλ°μ€ν¬λ¦½νΈκ° μ€νλλλ‘ νλ μμ
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello</div>
</body>
<script>
// innerHTML νλ‘νΌν°λ‘ μ€ν¬λ¦½νΈ νκ·Έλ₯Ό μ½μ
νμ¬ μλ°μ€ν¬λ¦½νΈκ° μ€νλλλ‘ νλ€.
// HTML5λ innerHTML νλ‘νΌν°λ‘ μ½μ
λ script μμ λ΄μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννμ§ μλλ€.
document.getElementById('foo').innerHTML
= '<script>alert(document.cookie)</script>';
</script>
</html>=> HTML5λ innerHTML νλ‘νΌν°λ‘ μ½μ λ script μμ λ΄μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννμ§ μμ. HTML5λ₯Ό μ§μνλ λΈλΌμ°μ μμ λμνμ§ μμ.
νμ§λ§ script μμ μμ΄λ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν 곡격μ κ°λ₯
κ°λ¨ν ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν 곡격
<!DOCTYPE html>
<html>
<body>
<div id="foo">Hello</div>
</body>
<script>
// μλ¬ μ΄λ²€νΈλ₯Ό κ°μ λ‘ λ°μμμΌμ μλ°μ€ν¬λ¦½νΈ μ½λκ° μ€νλλλ‘ νλ€.
document.getElementById(
'foo'
).innerHTML = `<img src="x" onerror="alert(document.cookie)">`;
</script>
</html>innerHTML νλ‘νΌν°λ₯Ό μ¬μ©ν DOM μ‘°μμ ꡬνμ΄ κ°λ¨νκ³ μ§κ΄μ μ΄μ§λ§
ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν
곡격μ μ·¨μ½νλ€λ λ¨μ μ΄ μμ
HTML μλν°μ μ΄μ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν 곡격μ μλ°©νκΈ° μν΄ μ μ¬μ μνμ μ κ±°νλ κΈ°λ₯. DOMPurify λΌμ΄λΈλ¬λ¦¬ μ¬μ© κΆμ₯
DOMPurify.sanitize('<img src="x" onerror="alert(document.cookie)" />');=> <img src="x">
λ λ€λ₯Έ λ¨μ : μμ λ
Έλμ innerHTML νλ‘νΌν°μ HTML λ§ν¬μ
λ¬Έμμ΄μ ν λΉνλ©΄ μμ λ
Έλμ λͺ¨λ μμ λ
Έλλ₯Ό μ κ±°νκ³ ν λΉν HTML λ§ν¬μ
λ¬Έμμ΄μ νμ±νμ¬ DOMμ λ³κ²½
<!DOCTYPE html>
<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>';
</script>
</html>=> li.banana μμ λ
Έλλ§ μμ±νμ¬ μμ μμλ‘ μΆκ°ν κ² κ°μ§λ§
#fruits μμμ λͺ¨λ μμ λ
Έλ(li.apple)λ₯Ό μ κ±°νκ³
μλ‘κ² μμ λ
Έλ li.apple, li.bananaλ₯Ό μμ±νμ¬ μμ μμλ‘ μΆκ°ν¨
39-48 μ½λμ μΆμ½ νν
$fruits.innerHTML += '<li class="banana">Banana</li>';$fruits.innerHTML = $fruits.innerHTML + '<li class="banana">Banana</li>';
// '<li class="apple">Apple</li>' + '<li class="banana">Banana</li>'λΉν¨μ¨μ : κΈ°μ‘΄μ μμ λ ΈλκΉμ§ λͺ¨λ μ κ±°νκ³ λ€μ μ²μλΆν° μλ‘κ² μμ λ Έλλ₯Ό μμ±ν΄ DOMμ λ°μ
λ λ€λ₯Έ λ¨μ : μλ‘μ΄ μμλ₯Ό μ½μ ν λ μ½μ λ μμΉλ₯Ό μ§μ ν μ μμ li.appleκ³Ό li.orange μμ μ¬μ΄μ μλ‘μ΄ μμλ₯Ό μ½μ νκ³ μΆμ κ²½μ° innerHTML νλ‘νΌν°λ₯Ό μ¬μ©νλ©΄ μ½μ μμΉλ₯Ό μ§μ ν μ μμ.
<ul id="fruits">
<li class="apple">Apple</li>
<li class="orange">Orange</li>
</ul>=> innerHTML νλ‘νΌν°λ 볡μ‘νμ§ μμ μμλ₯Ό μλ‘κ² μΆκ°ν λλ μ μ©νμ§λ§
κΈ°μ‘΄ μμλ₯Ό μ κ±°νμ§ μμΌλ©΄μ μμΉλ₯Ό μ§μ ν΄ μλ‘μ΄ μμλ₯Ό μ½μ
ν΄μΌ ν λλ μ¬μ©νμ§ μλ κ²μ΄ μ’μ
Element.prototype.insertAdjacentHTML(position, DOMString) λ©μλλ κΈ°μ‘΄ μμ μ κ±°νμ§ μμΌλ©΄μ μμΉλ₯Ό μ§μ ν΄ μλ‘μ΄ μμ μ½μ
λ λ²μ§Έ μΈμλ‘ μ λ¬ν HTML λ§ν¬μ
λ¬Έμμ΄(DOMString)μ νμ±νκ³
κ·Έ κ²°κ³Όλ‘ μμ±λ λ
Έλλ₯Ό 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν μμΉ(position)μ μ½μ
νμ¬ DOMμ λ°μ
- 첫 λ²μ¨° μΈμλ‘ μ λ¬ κ°λ₯ν λ¬Έμμ΄
- beforebegin
- afterbegin
- beforeend
- afterend
<!DOCTYPE html>
<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>μ΄ λ©μλλ κΈ°μ‘΄ μμμλ μν₯μ μ£Όμ§ μκ³ , μλ‘κ² μ½μ
λ μμλ§μ νμ±νμ¬ μμ μμλ‘ μΆκ°νλ―λ‘
innerHTML νλ‘νΌν°λ³΄λ€ ν¨μ¨μ μ΄κ³ λΉ λ¦
νμ§λ§, λ§μ°¬κ°μ§λ‘ HTML λ§ν¬μ λ¬Έμμ΄μ νμ±νλ―λ‘ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν 곡격μ μ·¨μ½ν κ²μ λμΌ
innerHTML νλ‘νΌν°, insertAdjacentHTML λ©μλλ HTML λ§ν¬μ λ¬Έμμ΄μ νμ±νμ¬ λ Έλ μμ±νκ³ DOMμ λ°μ
DOMμ λ
Έλλ₯Ό μ§μ μμ±/μ½μ
/μμ /μΉννλ λ©μλλ μ 곡
<!DOCTYPE html>
<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μ μΆκ°
Document.prototype.createElement(tagName) λ©μλλ μμ λ
Έλλ₯Ό μμ±νμ¬ λ°ν
tagNameμλ νκ·Έ μ΄λ¦μ λνλ΄λ λ¬Έμμ΄μ μΈμλ‘ μ λ¬
// 1. μμ λ
Έλ μμ±
const $li = document.createElement('li');=> κΈ°μ‘΄ DOMμ μΆκ°νμ§ μκ³ νλ‘ μ‘΄μ¬νλ μν. μμ λ
Έλλ₯Ό μμ±ν λΏ, DOMμ μΆκ°νμ§λ μμ
μμ±λ μμ λ
Έλλ₯Ό DOMμ μΆκ°νλ λ³λ μ²λ¦¬ νμ
// 1. μμ λ
Έλ μμ±
const $li = document.createElement('li');
// μμ±λ μμ λ
Έλλ μλ¬΄λ° μμ λ
Έλκ° μλ€.
console.log($li.childNodes); // NodeList []Element.prototype.createTextNode(text) λ©μλλ ν
μ€νΈ λ
Έλλ₯Ό μμ±ν΄ λ°ν
λ§€κ°λ³μ textμλ ν
μ€νΈ λ
Έλμ κ°μΌλ‘ μ¬μ©ν λ¬Έμμ΄μ μΈμλ‘ μ λ¬
// 2. ν
μ€νΈ λ
Έλ μμ±
const textNode = document.createTextNode('Banana');ν
μ€νΈ λ
Έλλ μμ λ
Έλμ μμ λ
Έλ. createTextNode λ©μλλ‘ μμ±ν ν
μ€νΈ λ
Έλλ νλ‘ μ‘΄μ¬νλ μνμ΄κΈ°μ μμ λ
Έλμ μΆκ°νλ μ²λ¦¬κ° λ³λλ‘ νμ.
Node.prototype.appendChild(childNode) λ©μλλ λ§€κ°λ³μ childNodeμκ² μΈμλ‘ μ λ¬ν λ
Έλλ₯Ό μ΄ λ©μλλ₯Ό νΈμΆν λ
Έλμ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°
appendChild λ©μλ μΈμλ‘ createTextNode λ©μλλ‘ μμ±ν ν μ€νΈ λ Έλλ₯Ό μ λ¬νλ©΄ appendChild λ©μλλ₯Ό νΈμΆν λ Έλμ λ§μ§λ§ μμ λ Έλλ‘ ν μ€νΈ λ Έλ μΆκ°λ¨
// 3. ν
μ€νΈ λ
Έλλ₯Ό $li μμ λ
Έλμ μμ λ
Έλλ‘ μΆκ°
$li.appendChild(textNode);=> μμ λ
Έλμ ν
μ€νΈ λ
Έλκ° λΆμ κ΄κ³λ‘ μ°κ²°λ¨. κΈ°μ‘΄ DOMμ μΆκ°λμ§λ μμ μν
μμ λ
Έλμ μμ λ
Έλκ° νλλ μλ κ²½μ°, ν
μ€νΈ λ
Έλλ₯Ό μμ±ν΄ μμ λ
Έλμ μμ λ
Έλλ‘ ν
μ€νΈ λ
Έλλ₯Ό μΆκ°νλ κ²λ³΄λ€ textContent νλ‘νΌν°λ₯Ό μ¬μ©νλ νΈμ΄ λμ± κ°νΈ
// ν
μ€νΈ λ
Έλλ₯Ό μμ±νμ¬ μμ λ
Έλμ μμ λ
Έλλ‘ μΆκ°
$li.appendChild(document.createTextNode('Banana'));
// $li μμ λ
Έλμ μμ λ
Έλκ° νλλ μλ μ μ½λμ λμΌνκ² λμνλ€.
$li.textContent = 'Banana';=> μμ λ
Έλμ μμ λ
Έλκ° μλ κ²½μ°, μμ λ
Έλμ textContent νλ‘νΌν°μ λ¬Έμμ΄μ ν λΉνλ©΄ μμ λ
Έλμ λͺ¨λ μμ λ
Έλκ° μ κ±°λκ³ ν λΉν λ¬Έμμ΄μ΄ ν
μ€νΈλ‘ μΆκ°λλ―λ‘ μ£Όμν΄μΌ ν¨
Node.prototype.appendChild λ©μλλ₯Ό μ¬μ©ν΄ ν
μ€νΈ λ
Έλμ λΆμ κ΄κ³λ‘ μ°κ²°ν μμ λ
Έλλ₯Ό #fruits μμ λ
Έλμ λ§μ§λ§ μμ μμλ‘ μΆκ°
// 4. $li μμ λ
Έλλ₯Ό #fruits μμ λ
Έλμ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°
$fruits.appendChild($li);=> μ΄ κ³Όμ μμ λΉλ‘μ μλ‘κ² μμ±ν μμ λ
Έλκ° DOMμ μΆκ°λ¨. κΈ°μ‘΄μ DOMμ μμ λ
Έλλ₯Ό μΆκ°νλ μ²λ¦¬λ μ΄ κ³Όμ λΏ.
DOMμ ν λ² λ³κ²½λκ³ , μ΄λ 리νλ‘μ°, 리νμΈνΈκ° μ€νλ¨
<!DOCTYPE html>
<html>
<body>
<ul id="fruits"></ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
['Apple', 'Banana', 'Orange'].forEach((text) => {
// 1. μμ λ
Έλ μμ±
const $li = document.createElement('li');
// 2. ν
μ€νΈ λ
Έλ μμ±
const textNode = document.createTextNode(text);
// 3. ν
μ€νΈ λ
Έλλ₯Ό $li μμ λ
Έλμ μμ λ
Έλλ‘ μΆκ°
$li.appendChild(textNode);
// 4. $li μμ λ
Έλλ₯Ό #fruits μμ λ
Έλμ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°
$fruits.appendChild($li);
});
</script>
</html>=> 3κ°μ μμ λ
Έλ μμ±ν΄ DOMμ 3λ² μΆκ°, DOMμ΄ 3λ² λ³κ²½λλ κ²(리νλ‘μ°, 리νμΈνΈ 3λ² μ€ν) => λΉν¨μ¨μ
DOMμ λ³κ²½νλ κ²μ λμ λΉμ©μ΄ λλ μ²λ¦¬μ΄λ―λ‘, κ°κΈμ νμλ₯Ό μ€μ΄λ νΈμ΄ μ±λ₯μ μ 리
컨ν
μ΄λ μμ μ¬μ©.
컨ν
μ΄λ μμ 미리 μμ±νκ³ , DOMμ μΆκ°ν 3κ°μ μμ λ
Έλλ₯Ό 컨ν
μ΄λ μμμ μμ λ
Έλλ‘ μΆκ°νκ³ , 컨ν
μ΄λ μμλ₯Ό #fruits μμμ μμμΌλ‘ μΆκ°νλ©΄ DOMμ ν λ²λ§ λ³κ²½λ¨
<!DOCTYPE html>
<html>
<body>
<ul id="fruits"></ul>
</body>
<script>
const $fruits = document.getElementById('fruits');
// 컨ν
μ΄λ μμ λ
Έλ μμ±
const $container = document.createElement('div');
['Apple', 'Banana', 'Orange'].forEach((text) => {
// 1. μμ λ
Έλ μμ±
const $li = document.createElement('li');
// 2. ν
μ€νΈ λ
Έλ μμ±
const textNode = document.createTextNode(text);
// 3. ν
μ€νΈ λ
Έλλ₯Ό $li μμ λ
Έλμ μμ λ
Έλλ‘ μΆκ°
$li.appendChild(textNode);
// 4. $li μμ λ
Έλλ₯Ό 컨ν
μ΄λ μμμ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°
$container.appendChild($li);
});
// 5. 컨ν
μ΄λ μμ λ
Έλλ₯Ό #fruits μμ λ
Έλμ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°
$fruits.appendChild($container);
</script>
</html>=> DOMμ ν λ²λ§ λ³κ²½νλ―λ‘ μ±λ₯μ μ 리.
νμ§λ§ λΆνμν 컨ν μ΄λ μμ(div)κ° DOMμ μΆκ°λλ λΆμμ©μ΄ μμ => λ°λμ§νμ§ μμ
<ul id="fruits">
<div>
<li>apple</li>
<li>banana</li>
<li>orange</li>
</div>
</ul>DocumentFragment λ Έλλ₯Ό ν΅ν΄ ν΄κ²°. DocumentFragment λ Έλλ λ¬Έμ, μμ, μ΄νΈλ¦¬λ·°νΈ, ν μ€νΈ λ Έλμ κ°μ λ Έλ κ°μ²΄μ μΌμ’ . λΆλͺ¨ λ Έλκ° μμ΄μ κΈ°μ‘΄ DOMκ³Όλ λ³λλ‘ μ‘΄μ¬.
컨ν μ΄λ μμμ κ°μ΄ μμ λ Έλλ€μ λΆλͺ¨ λ Έλλ‘μ λ³λμ μλΈ DOMμ ꡬμ±ν΄ κΈ°μ‘΄ DOMμ μΆκ°νκΈ° μν μ©λλ‘ μ¬μ©.
DocumentFragment λ
Έλλ κΈ°μ‘΄ DOMκ³Όλ λ³λλ‘ μ‘΄μ¬. DocumentFragment λ
Έλμ μμ λ
Έλλ₯Ό μΆκ°νμ¬λ κΈ°μ‘΄ DOMμλ μ΄λ ν λ³κ²½λ λ°μνμ§ μμ.
DocumentFragment λ
Έλλ₯Ό DOMμ μΆκ°νλ©΄ μμ μ μ κ±°λκ³ μμ μ μμ λ
Έλλ§ DOMμ μΆκ°λ¨
Document.prototype.createDocumentFragment λ©μλλ λΉμ΄ μλ DocumentFragment λ
Έλλ₯Ό μμ±νμ¬ λ°ν
<!DOCTYPE html>
<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μ μΆκ°νλ κ²½μ°, DocumentFragment λ Έλλ₯Ό μ¬μ©νλ κ²μ΄ λ ν¨μ¨μ
Node.prototype.appendChild λ©μλλ μΈμλ‘ μ λ¬λ°μ λ
Έλλ₯Ό μμ μ νΈμΆν λ
Έλμ λ§μ§λ§ μμ λ
Έλλ‘ DOMμ μΆκ°.
λ
Έλλ₯Ό μΆκ°ν μμΉ μ§μ ν μ μμ. μΈμ λ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°.
<!DOCTYPE html>
<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) λ©μλλ 첫 λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ
Έλλ₯Ό λ λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ
Έλ μμ μ½μ
.
<!DOCTYPE html>
<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>λ λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ Έλλ λ°λμ insertBefore λ©μλλ₯Ό νΈμΆν λ Έλμ μμ λ Έλμ΄μ΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ DOMException μλ¬ λ°μ.
<!DOCTYPE html>
<html>
<body>
<div>test</div>
<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'));
// λ λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ
Έλλ λ°λμ #fruits μμ λ
Έλμ μμ λ
Έλμ΄μ΄μΌ νλ€.
$fruits.insertBefore($li, document.querySelector('div'));
// DOMException
</script>
</html>λ λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ Έλκ° nullμ΄λ©΄ 첫 λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ Έλλ₯Ό insertBefore λ©μλλ₯Ό νΈμΆν λ Έλμ λ§μ§λ§ μμ λ Έλλ‘ μΆκ°. appendChild λ©μλμ²λΌ λμ
<!DOCTYPE html>
<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'));
// λ λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ
Έλκ° nullμ΄λ©΄ $li μμ λ
Έλλ₯Ό #fruits μμ λ
Έλμ λ§μ§λ§ μμ λ
Έλλ‘ μΆκ°
$fruits.insertBefore($li, null);
</script>
</html>DOMμ μ΄λ―Έ μ‘΄μ¬νλ λ
Έλλ₯Ό appendChild λλ insertBefore λ©μλλ₯Ό μ¬μ©νμ¬ DOMμ μΆκ°νλ©΄ νμ¬ μμΉμμ λ
Έλλ₯Ό μ κ±°νκ³ μλ‘μ΄ μμΉμ λ
Έλλ₯Ό μΆκ°. λ
Έλκ° μ΄λνλ€.
<!DOCTYPE html>
<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λ₯Ό μΈμλ‘ μ λ¬νλ©΄ λ
Έλλ₯Ό κΉμ 볡μ¬(deep clone)νμ¬ λͺ¨λ μμ λ
Έλκ° ν¬ν¨λ μ¬λ³Έμ μμ±
falseλ₯Ό μΈμλ‘ μ λ¬νκ±°λ μλ΅νλ©΄ μμ 볡μ¬(shallow copy)νμ¬ λ
Έλ μμ λ§μ μ¬λ³Έ μμ±. μμ 볡μ¬λ‘ μμ±λ μμ λ
Έλλ μμ λ
Έλλ₯Ό 볡μ¬νμ§ μμΌλ―λ‘ ν
μ€νΈ λ
Έλλ μμ
<!DOCTYPE html>
<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) λ©μλλ μμ μ νΈμΆν λ
Έλμ μμ λ
Έλλ₯Ό λ€λ₯Έ λ
Έλλ‘ κ΅μ²΄ν¨
첫 λ²μ§Έ λ§€κ°λ³μ newChildμλ κ΅μ²΄ν μλ‘μ΄ λ
Έλλ₯Ό μΈμλ‘ μ λ¬,
λ λ²μ§Έ λ§€κ°λ³μ oldChildμλ μ΄λ―Έ μ‘΄μ¬νλ κ΅μ²΄λ λ
Έλλ₯Ό μΈμλ‘ μ λ¬
oldChild λ§€κ°λ³μμ μΈμλ‘ μ λ¬ν λ Έλλ, replaceChild λ©μλλ₯Ό νΈμΆν λ Έλμ μμ λ Έλμ΄μ΄μΌ ν¨
μ¦, replaceChild λ©μλλ μμ μ νΈμΆν λ
Έλμ μμ λ
ΈλμΈ oldChild λ
Έλλ₯Ό newChild λ
Έλλ‘ κ΅μ²΄.
μ΄λ oldChild λ
Έλλ DOMμμ μ κ±°λ¨
<!DOCTYPE html>
<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μμ μμ .
μΈμλ‘ μ λ¬ν λ Έλλ removeChild λ©μλλ₯Ό νΈμΆν λ Έλμ μμ λ Έλμ΄μ΄μΌ ν¨.
<!DOCTYPE html>
<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>