console.dir
λ©μλλ DOMμ κ°μ²΄λ‘ μΆλ ₯ν΄μ£Όλ λ©μλμ΄λ€.
console.dir(document.body)
λ₯Ό μ½μμ°½μ μ
λ ₯νκ³ μ¬λ¬ ν€ μ€ children
μ μ°ΎμΌλ©΄ κ°μ²΄λ‘ body
μ μμ μμλ‘ μ 리λμ΄ μλ κ²μ μ°Ύμ μ μλ€.
μ΄ν μ΄ ν€μ λ€μ μ κ·Όνλ €λ©΄ κ°μ²΄μ λ· λ
Έν
μ΄μ
μΌλ‘ ν΄λΉ ν€ children
μ μ
λ ₯νλ©΄ μνλ μ λ³΄λ§ μ‘°ν ν μ μλ€.
<body> <div>division 1</div> <div>division 2</div> <div>division 3</div> </body>
console.dir(document.body.children) // { 0: div, 1: div, 2: div }
λΆλͺ¨ μμλ₯Ό μ°Ύμλ΄λ λ©μλλ λκ°μ§κ° μλλ°, νλλ node.parentElement
μ΄κ³ , λ€λ₯Έ νλλ node.parentNode
μ΄λ€.
node.parentElement
λ©μλλ λΆλͺ¨μ μμ λ
Έλλ§ λ°ννλ λ©μλμ΄μ§λ§ λ§μ½ λΆλͺ¨ λ
Έλκ° μκ±°λ λΆλͺ¨κ° λ μμκ° μλλΌλ©΄ null
μ λ°ννλ€.
node.parentNode
μ κ²½μ°μ λΆλͺ¨ λ
Έλκ° λ¬Έμ λ
ΈλλΌλ λ
Έλλ‘ μ λ°ννλ€.
DOMμμ μ‘°μμ νμν νλ‘μΈμ€λ ν¬κ² 4+1 κ°μ§μ΄λ€.
C(A)RUDλ‘ κ°κ° Create
, Append
, Read
, Update
, Delete
λ₯Ό λ»νλ€.
Create
λ©μλλ‘λ document.createElement
κ° μλ€.
Append
λ©μλλ‘λ node.append
μ node.appendChild
, node.insertBefore
λ±μ΄ μλ€.
Read
λ©μλλ‘λ document.querySelector
μ document.querySelectorAll
μ΄ μκ³
ꡬν λ©μλλ‘ document.getElementby~
κ° μλ€.
Update
λ©μλλ‘λ λνμ μΌλ‘ node.textContent
μ element.id
, element.classList
, κ·Έλ¦¬κ³ element.setAttribute
λ±μ΄ μλ€.
Delete
λ©μλλ‘λ node.delete
, node.removeChild
, node.innerHTML = ''
, node.textContent = ''
λ±μ΄ μλλ° μ΄μ€ node.innerHTML
μ μ΄μ©ν λ©μλλ 보μ μ·¨μ½μ λ¬Έμ λ‘ μ μ°μ΄μ§ μλλ€.
ν΄λΉ λ©μλλ document
κ°μ²΄μ createElement()
λ©μλλ₯Ό μ΄μ©ν΄μ μμλ₯Ό μμ±νλ λ©μλμ΄λ€.
μμ±νλ λ°©λ²μ λ³μ νλλ₯Ό μ μΈνκ³ κ±°κΈ°μ createElement
λ©μλλ‘ μμ±ν μμλ₯Ό ν λΉνλ€.
μ΄λ μμλ₯Ό μμ±νλ€κ³ HTML νκ·Έμ λ°λ‘ μ μ© λλ κ²μ΄ μλλΌ DOM treeμ μ°κ²°λμ§ λͺ»ν, μ¦, λΆ λ μλ μνκ° λλ€. κ·Έλμ μ΄ λΆ λ μλ μμλ₯Ό λ νΈλ¦¬μ μ°κ²° μν€λ Append
κ³Όμ μ΄ νμν κ²μ΄λ€.
let addDiv = document.createElement('div') console.log(addDiv) // <div></div>; λΉ div μ리먼νΈκ° λ³μ addDivμ ν λΉλμλ€.
λ λ©μλλ€ μ λΆ λΆλͺ¨ λ Έλμ μμ λ Έλλ₯Ό μΆκ°νλ λ©μλ μ΄λ λͺκ°μ§ μ£Όμν μ°¨μ΄κ° μλ€.
append
λ©μλλ DOM String
, μ¦ λ¬Έμμ΄μ μΆκ°ν μ μμΌλ appendChild
λ©μλλ λ
Έλ μμλ§ μΆκ°ν μ μλ€.
append
λ λ°ν κ°μ΄ μμΌλ (undefined) appendChild
λ μΆκ°λ λ
Έλλ₯Ό λ°ννλ€.
append
λ νλ²μ μ¬λ¬ λ
Έλμ λ¬Έμμ΄μ μΆκ°ν μ μμΌλ appendChild
λ νλ²μ ν λ
Έλ μ©λ§ μΆκ° ν μ μλ€.
let addDiv = document.createElement('div'); addDiv.append('Hello!'); // undefined; console.log(addDiv); // <div>Hello!</div>; addDiv.appendChild('Hi, there!'); // TypeError: Failed to execute 'appendChild' on 'Node' // appendChild λ λ Έλλ§ μ μ©μν¬ μ μμΌλ©° appendλ λ¬Έμμ΄λ μΆκ°ν μ μλ€. document.body.append(addDiv); // undefined; document.body.appendChild(addDiv); // <div>Hello!</div>; // appendλ λ°ννλ κ°μ΄ μμ§λ§ appendChildλ μ μ©ν λ Έλλ₯Ό λ°ννλ€. let addSpan = document.createElement('span'); let addP = document.createElement('p'); document.body.append(addDiv, addSpan, 'Yeah!', addP); // undefined document.body appendChild(addDiv, addSpan, 'Yeah!', addP); // <div>Hello!</div>; κ°μ₯ μ²μ μ μ λ³μλ§ μ μ©λλ€.
insertBefore
λ©μλλ appendChild
μ κ΅μ₯ν μ μ¬νλ€.
νλ μ°¨μ΄ μ μ appendChild
λ‘ λ
Έλλ₯Ό μ μ©μν€κ² λλ©΄ λΆλͺ¨ λ
Έλ μλ νμ λ
Έλλ€ μ¬μ΄μμλ μ΅νλ―Έμ μΆκ°λλ, insertBefore
λ©μλλ₯Ό μ¬μ©νλ©΄ νμ λ
Έλ μ¬μ΄μμ μ΄λμ μΆκ°ν μ§ μ§μ ν μ μλ€.
λ¬Έλ²μ parentNode.insertBefore(newNode, referenceNode)
μ΄λ©° newNode
κ° referenceNode
μμ μ μ©λκ² λλ€.
λ§μ½ referenceNode
μ리μ null
μ΄ μ€λ©΄ append
μ νμ λ
Έλμ€ κ°μ₯ λ§μ§λ§μ μμΉνκ² λλ€.
<!--insertBefore μ μ© μ --> <body> <div class='box'>division 1</div> <div>division 2</div> <div>division 3</div> </body>
let addDiv = document.createElement('div'); addDiv.textContent = 'Hello!'; document.body.insertBefore(addDiv, document.body.children[0]); //<div>Hello!</div>; appendChildμ κ°μ΄ μ μ©λ λ Έλ λ°νλλ€. // document.body.children[0] λμ document.querySelector('.box')λ₯Ό μ¬μ©ν΄λ // κ°μ κ²°κ³Όκ° λμ¨λ€.
<!--insertBefore μ μ© ν--> <body> <div>Hello!</div> <div class='box'>division 1</div> <div>division 2</div> <div>division 3</div> </body>
document.querySelector()
μ κ²½μ°λ μ΄μ ν¬μ€ν
μλ μ μ μΈκΈν μ μ΄ μλ―, CSS μ
λ ν°λ₯Ό μΈμλ‘ λ°μΌλ©° μΌμΉνλ κ²μ νμνλλ°, κ°μ₯ μ²μ μ°Ύμ κ²μ λ°ννκ³ νμμ μ€μ§νλ€.
document.querySelectorAll()
μ κ²½μ°λ μΈμμ ν΄λΉνλ λͺ¨λ μμλ₯Ό λΆλͺ¨ μμ κ΄κ³ μκ΄μμ΄ νμνκ³ Array-like Object, μ μ¬ κ°μ²΄λ‘ λ°ννλ€.
μ΄ μ μ¬ κ°μ²΄μ for
λ¬Έμ μ΄μ©ν΄ μμμ μΌκ΄μ μΌλ‘ μ μ©μν¬ μ μμ§λ§, λ°°μ΄κ°μ΄ 보μ¬λ λ°°μ΄μ μλλΌμ mapκ³Ό κ°μ λ°°μ΄ μ μ© λ©μλκ° μλνμ§ μλλ€.
(forEach()μ κ²½μ°λ μ μ¬λ°°μ΄μ νλ‘ν μ κΈ°μ
λμ΄ μκΈ°μ μλνλ€.)
λ°°μ΄ μ μ© λ©μλλ₯Ό μ¬μ©νκΈ° μν΄μ μ΄ μ μ¬ λ°°μ΄μ μ§μ§ λ°°μ΄λ‘ 볡μ¬ν΄μΌνλλ° κ·Έ λ°©λ²μΌλ‘λ, Array.from
λ©μλλ₯Ό μ΄μ©νλ λ°©λ², μ κ° κ΅¬λ¬Έ
μ μ΄μ©ν΄ 볡μ¬νλ λ°©λ², slice()
λ₯Ό μ΄μ©ν΄ 볡μ¬νλ λ°©λ² λ±μ΄ μλ€.
<body> <div class='box'>division 1</div> <div class='box'>division 2</div> <div class='box'>division 3</div> </body>
console.log(document.querySelector('.box')) // <div class='box'>division 1</div>; κ°μ₯ λ¨Όμ μ°Ύμ μμλ₯Ό λ°ννλ€. console.log(document.querySelectorAll('.box')) // [div.box, div.box, div.box]; λ°°μ΄ κ°μ 보μ΄λ μ μ¬ κ°μ²΄λ‘ λ°ννλ€. let boxes = document.querySelectorAll('.box') for( i = 0; i < boxes.length; i++) { boxes[i].style.color = 'red'; } // μμ ν μμ μ κ°μ΄ νμλ μμ μ 체μ μ μ©μν¬ μ μλ€.
μ΄ κ΅¬μλ λ©μλλ€ μμ μ°Ύλ κ°μ₯ 첫λ²μ¬ μμλ₯Ό λ°ννκ³ μ€μ§νμ§λ§ querySelectorAll
κ°μ΄ μλνλκ² λ μλλ° λ°λ‘ getElementByTagName
κ³Ό getElementByClassName
μ΄λ€.
μ΄ λ λ©μλλ querySelectorAll
κ³Ό λΉμ·νκ² λΆλͺ¨μμκ΄κ³ μκ΄μμ΄ ν΄λΉνλ κ² μ λΆ μ ννλ©° μ νν μμλ₯Ό μ μ¬ κ°μ²΄λ‘ λ°ννλ€.
element.textContent
λ μμμ λ¬Έμμ΄μ μΆκ°νλ λ©μλμ΄κ³ ,
element.classList
μμμ ν΄λμ€λ₯Ό μΆκ°νλ λ©μλμ΄λ©°,
element.id
μμμ idλ₯Ό μΆκ°νλ λ©μλμ΄λ€.
setAttribute
λ μμ΄λμ ν΄λμ€λ λ¬Όλ‘ , μμμ μ λ°μ μΈ μμ±μ λΆμ¬νκ² λμμ£Όλ λ©μλμ΄λ€.
λ¬Έλ²μ element.setAttribue('name', 'value')
μ΄λ€.
classList
κ°μ κ²½μ° μ‘΄μ¬νμ§ μλ ν΄λμ€λ₯Ό μΆκ°νκ±°λ μ κ±°ν΄λ μλ¬κ° λ°μνμ§ μλλ€.
λκ° λ©μλ μ λΆ HTML λ΄μ©μ κ°μν μ μμΌλ
innerHTML
κ°μ κ²½μ¨λ HTMLμ μ§μ μμ νλ μ μμ 보μ μ·¨μ½μ μ΄ λ°μνλ©° μ΄λ₯Ό λ
Έλ¦° 곡격μ <script>
νκ·Έλ₯Ό μ΄μ©ν XSS Attackμ΄ λνμ μ΄λ€.
node.remove()
μ node.removeChild()
λ λλ€ λ
Έλλ₯Ό μμ νλ λ©μλμ΄μ§λ§ μ°¨μ΄ μ μ΄ λͺκ°μ§ μλ€.
remove
κ°μ κ²½μ°λ λ©μλλ₯Ό μ€νν κ²½μ° λ
Έλ λ°μ΄ν°λ₯Ό μμ ν ν λ°ν μμ΄ (undefined) λ©μλκ° μ’
λ£λλ€.
removeChild
κ°μ κ²½μ°λ μ νν μ νν μμλ₯Ό λ νΈλ¦¬μμ μ°κ²°μ λμ΄λ΄ μ κ·Όμ΄ μλκ² νλ κ²μ΄λ€.
μ΄μ λμμ μ°κ²°μ λμ΄λΈ κ°μ λ°νν΄μ λ€λ₯Έ λ³μμ ν λΉν μλ μλ€.
λ§μ½ ν λΉνμ§ μλλ€λ©΄ κ°λΉμ§ 컬λ μ
μ μν΄ μλμ μΌλ‘ μ 리λλ€.
<body> <div class='box'>division 1</div> <div class='box'>division 2</div> <div class='box'>division 3</div> </body>
document.querySelector('.box').remove(); // undefined; ν΄λΉ λ Έλλ₯Ό μμ νλ€. document.querySelector('.box').removeChild(); // <div class='box'>division 2</div>; ν΄λΉ λ Έλμ λ νΈλ¦¬μμ μ°κ²°μ λμ΄λ΄κ³ // ν΄λΉ λ Έλλ₯Ό λ°ν. μ΄λλ‘ λλ€λ©΄ κ°λΉμ§ μ λ ν°μ μν΄ λ°μ΄ν°λ μμ λλ€. let div2 = document.querySelector('.box').removeChild(); // μ΄λ° μμΌλ‘ λ€λ₯Έ λ³μμ ν λΉνλ€λ©΄ κ°λΉμ§ 컬λ ν°μ μν΄ μμ λμ§ μκ³ νμ // μ¬μ¬μ© ν μ μλ€.
cloneNode
λ©μλλ λ
Έλλ₯Ό 볡μ νλ λ©μλμ΄λ€.
λ¬Έλ²μ λ€μκ³Ό κ°μΌλ©° node.cloneNode(deep)
μ΄ μ€ deep
μ 볡μ¬μ κΉμ΄λ₯Ό κ²°μ νλ μΈμμ΄λ€.
true
λ₯Ό λ£μΌλ©΄ κΉμ 볡μ¬λ₯Ό νλ©° false
λ₯Ό λ£μΌλ©΄ μμ 볡μ¬λ₯Ό νκ² λλ€.
μ€λμ DOM ꡬ쑰 μ λ°κ³Ό μ΄λ₯Ό μμ νλ λ²μ μ΅νλ€.
μ ν¨μ± κ²μ¬ μ€νλ¦°νΈλ₯Ό μ§ννλ©° μ΄λ²€νΈ νΈλ€λ¬μ λν κ°μ μ‘μλ€.
νμ΄νλ‘κ·Έλλ°νλ©΄μ νΌμ νμ£Όν΄μ μ²λ¦¬ν΄λκ°λ€.
μ€λμ μ λ°μ μΌλ‘ νμ΄νλ‘κ·Έλλ°μ λν ννκ° λ§μ΄ λ¨λλ€.
μ΄λ² νμ΄λλ μμ£Ό μ ννμ λΆ μ΄μλλ° μ견μ λλ μ¬μ΄λ μμ΄ λ νΌμ νμ£Όν΄μ κ³Όμ λ₯Ό μ²λ¦¬ν΄ λκ°λ€.
μ€κ° μ€κ° λ무 λ§λκ°λ μΆμ΄μ νμμ μΌλ‘ μ견λ μ¬μ€λ΄€μ§λ§ λ΄κ° λ€μ μκ°ν΄λ λ무 νμμ μ΄μμ΄μ νμ΄ λΆμ΄ μμ² κΈ°μ΄μ΄ λΉ μ§μ
¨μ κ² κ°λ€.
μλ‘ μ»μ΄κ°λκ² λ§κ² νμ΄ νλ‘κ·Έλλ°νμ.