[TIL] JavaScript : DOM

AcidΒ·2021λ…„ 9μ›” 10일
0

πŸ“’ JavaScript

λͺ©λ‘ 보기
8/8
post-thumbnail

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ DOM에 λŒ€ν•œ λ‚΄μš©μœΌλ‘œ κ΄€λ ¨ μ„œμ μΈ DOM을 κΉ¨μš°μΉ˜λ‹€λ₯Ό ν¬ν•¨ν•˜μ—¬ μ—¬λŸ¬ μžλ£Œλ“€μ„ μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€! 😊
사싀상 ν•΄λ‹Ή μ„œμ  리뷰가 λ§žμ§€ μ•Šλ‚˜...

DOM을 μ•Œμ•„λ³΄μž! πŸ“ƒ

DOM(Document Object Model)μ΄λž€ 무엇인가. 정말 어디에도 μžˆλŠ” DOM은 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 톡해 HTML을 μ‘°μž‘ν•˜κΈ° μœ„ν•˜μ—¬ μ•Œμ•„μ•Ό ν•  κ°œλ… 쀑 ν•˜λ‚˜λ‹€. 단어 κ·ΈλŒ€λ‘œ DOM은 λ¬Έμ„œ 객체 λͺ¨λΈλ‘œ XMLμ΄λ‚˜ HTML λ¬Έμ„œμ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ μΌμ’…μ˜ μΈν„°νŽ˜μ΄μŠ€λ‹€.

πŸ’‘ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ κ°„λ‹¨ν•œ 이해

μΈν„°νŽ˜μ΄μŠ€(interface)λž€ μ„œλ‘œ λ‹€λ₯Έ 두 개의 μ‹œμŠ€ν…œ, μž₯치 μ‚¬μ΄μ—μ„œ μ •λ³΄λ‚˜ μ‹ ν˜Έλ₯Ό μ£Όκ³  λ°›λŠ” 경우의 μ ‘μ μ΄λ‚˜ κ²½κ³„λ©΄μœΌλ‘œ μ •μ˜λœλ‹€. μ΄λ ‡κ²Œ λ§ν•˜λ©΄ μ–΄λ ΅κ²Œ λ“€λ¦¬μ§€λ§Œ, λ‘˜ μ‚¬μ΄μ—μ„œ μƒν˜Έμž‘μš© ν•˜λŠ” 곳이라고 ν•΄μ„ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° νŽΈν•˜λ‹€.

κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬κ°€ ν”νžˆ λ§ν•˜λŠ” UI(User Interface)λŠ” μ‚¬μš©μžμ™€ 컴퓨터 κ°„μ˜ μƒν˜Έμž‘μš© 접접이라고 해석할 수 μžˆλ‹€. λŒ€ν‘œμ μΈ UI μš”μ†Œλ‘œμ„œ λ²„νŠΌ, ν† κΈ€, λͺ¨λ‹¬ 등이 μžˆλŠ”λ° 각각의 κΈ°λŠ₯에 λŒ€ν•΄ 생각해보면 μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ 이해가 더 μˆ˜μ›”ν•  것이닀.

κ·Έλ ‡λ‹€λ©΄ μ™œ HTML은 DOM으둜 λ³€ν™˜λ˜μ–΄μ•Ό ν•˜λŠ” κ²ƒμΌκΉŒ? 사싀 μžλ°”μŠ€ν¬λ¦½νŠΈ μž…μž₯μ—μ„œ HTML은 μœ μ˜λ―Έν•œ 데이터 ν˜•μ‹μ΄ μ•„λ‹ˆλ‹€. 단지 ν…μŠ€νŠΈ ν˜•μ‹μ˜ 데이터인 것이닀. 이λ₯Ό 자유둭게 닀루기 μœ„ν•΄μ„œλŠ” 각 νƒœκ·Έ μš”μ†Œκ°€ μ–΄λ– ν•œ 상관관계λ₯Ό κ°–κ³ , μ–΄λ– ν•œ 속성을 κ°–λŠ” 지에 λŒ€ν•œ λ‚΄μš©μ„ μ •μ˜ν•˜μ—¬ 객체 ν˜•νƒœλ‘œ μ €μž₯ν•  ν•„μš”κ°€ μžˆμ—ˆλ˜ 것이닀.

πŸ’‘ DOM은 μ›λž˜ XML λ¬Έμ„œλ₯Ό μœ„ν•œ API μ˜€λ‹€?

κ°„λ‹¨ν•˜κ²Œ λ§ν•˜μžλ©΄, HTML의 문법이 XML 문법에 λΉ„ν•΄ 비ꡐ적 μœ μ—°ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

HTML은 가끔 μ‹œμž‘ λ˜λŠ” μ’…λ£Œμ— λŒ€ν•œ νƒœκ·Έλ₯Ό μƒλž΅ν•˜λŠ” 것이 κ°€λŠ₯ν•œλ°, μ΄λ ‡κ²Œ λ„ˆκ·ΈλŸ½κ³  νŽΈν•œ HTML의 μš”μ†Œκ°€ 곡식적인 문법을 μž‘μ„±ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“œλŠ” λ¬Έμ œκ°€ μžˆλ‹€. 그렇기에 λ³Έλ”” 비ꡐ적 μ—„κ²©ν•œ XML을 μœ„ν•œ κ²ƒμ΄μ—ˆμ§€λ§Œ, HTMLμ—μ„œλ„ μ‚¬μš© κ°€λŠ₯ν•˜λ„λ‘ ν™•μž₯λ˜μ—ˆλ‹€κ³  ν•œλ‹€.


μ•žμ—μ„œ μž‘μ„±ν–ˆλ˜ λΈŒλΌμš°μ €μ˜ μž‘λ™ λ°©μ‹μ—μ„œ DOM에 λŒ€ν•œ 이야기λ₯Ό 많이 ν–ˆλŠ”λ°, μ •μž‘ DOM에 λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…도 λΆ€μ‘±ν•˜κ³ , 이에 λŒ€ν•œ 근본적인 이해가 λΆ€μ‘±ν•œ 것 κ°™μ•„μ„œ ν•΄λ‹Ή ν¬μŠ€νŒ…μ„ μž‘μ„±ν•œλ‹€.

μ΄μ–΄μ§€λŠ” λ‚΄μš©μ—μ„œ DOM에 λŒ€ν•œ 이해λ₯Ό μœ„ν•΄μ„œ λ…Έλ“œ(node)에 λŒ€ν•΄ μ•Œμ•„λ³Ό 것이닀.

λ…Έλ“œ(node)ν•™κ°œλ‘  🌱

μœ„ μ—¬μ„±λΆ„μ²˜λŸΌ λ…Έλ“œλ₯Ό 자유자재둜 닀루기 μœ„ν•΄ λ…Έλ“œμ— λŒ€ν•΄ μ•Œμ•„λ³΄μž! ꡬ글에 λ…Έλ“œ(node)의 μ •μ˜μ— λŒ€ν•΄ κ²€μƒ‰ν•˜λ©΄ 컴퓨터 κ³Όν•™μ—μ„œ μ“°μ΄λŠ” 기초적인 λ‹¨μœ„λΌκ³  ν•œλ‹€. λ…Έλ“œμ— λŒ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό 같이 정리할 수 μžˆλ‹€.

  • DOM을 κ΅¬μ„±ν•˜λŠ” 각 μš”μ†ŒλŠ” λ…Έλ“œλ‹€.
  • λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λœ 트리 ν˜•νƒœμ˜ ꡬ쑰가 HTMLμ—μ„œ 인덱싱을 톡해 κ΅¬λΆ„λœ 계측 ꡬ쑰와 μΊ‘μŠν™”λ₯Ό ν‘œν˜„ν•œλ‹€.
  • λͺ¨λ“  μš”μ†Œκ°€ λ…Έλ“œμ— ν•΄λ‹Ήν•˜λ©°, 곡백과 주석도 λ§ˆμ°¬κ°€μ§€λ‹€.

λ…Έλ“œμ˜ μœ ν˜•


μ΄λŸ¬ν•œ λ…Έλ“œ 쀑 HTML λ¬Έμ„œλ₯Ό λ‹€λ£° λ•Œ κ°€μž₯ 일반적인 λ…Έλ“œ μœ ν˜•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • DOCUMENT_NODE (예 : window.document)
  • ELEMENT_NODE (예 : HTML의 νƒœκ·Έλ“€ <body>, <a> λ“±)
  • ATTRIBUTE_NODE (예 : class='funEdges')
  • TEXT_NODE (예 : μ€„λ°”κΏˆκ³Ό 곡백을 ν¬ν•¨ν•œ HTML λ‚΄ ν…μŠ€νŠΈ 문자)
  • DOCUMENT_FRAGMENT_NODE (예 : document.createDocumentFragment())
  • DOCUMENT_TYPE_NODE (예 : <!DOCTYPE html>)


μœ„ λ…Έλ“œ μœ ν˜•λ“€μ„ ν¬ν•¨ν•œ λͺ¨λ“  λ…Έλ“œλ“€μ€ 각각의 μš”μ†Œλ₯Ό 식별할 수 μžˆλŠ” μ½”λ“œ 값을 가진닀. λͺ¨λ“  λ…Έλ“œ μœ ν˜•λ“€κ³Ό 각각에 ν•΄λ‹Ήν•˜λŠ” μ½”λ“œ 값을 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.



λ…Έλ“œμ˜ 상속

DOM 트리의 각 λ…Έλ“œ κ°μ²΄λŠ” Node 둜 λΆ€ν„° 속성과 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›λŠ”λ‹€. μœ„ 그림은 상속 관계λ₯Ό ν‘œν˜„ν•œ 그림이닀. κ·Έλ¦Όμ—λŠ” λ‚˜μ˜€μ§€ μ•Šμ•˜μ§€λ§Œ, Node λ˜ν•œ λ‹€λ₯Έ κ°μ²΄λ“€μ²˜λŸΌ Object.prototype 으둜 λΆ€ν„° μƒμ†λ°›λŠ”λ‹€.

λ˜ν•œ, μœ„ κ·Έλ¦Όμ—μ„œ 확인할 수 μžˆλ“―μ΄ 각 λ…Έλ“œ κ°μ²΄λŠ” Node λ₯Ό ν¬ν•¨ν•œ ν•΄λ‹Ή λͺ¨λ“  μƒμœ„ κ°μ²΄λ‘œλΆ€ν„° 속성 및 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›λŠ”λ‹€.

λ…Έλ“œμ˜ 속성 및 λ©”μ„œλ“œ


λ…Έλ“œ 객체의 속성과 λ©”μ„œλ“œμ—μ„œ μ€‘μš”ν•œ λ‚΄μš©μ€ 계측 ꡬ쑰가 μ‘΄μž¬ν•˜κ³  주둜 관계λ₯Ό λ‹€λ£¬λ‹€λŠ” 점이닀. λ˜ν•œ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 바와 같이 μƒμœ„ λ…Έλ“œ 객체의 속성과 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›λŠ”λ‹€. λ‹€μŒμ˜ μ˜ˆμ‹œλ‘œ 이에 λŒ€ν•΄ κ°„λ‹¨νžˆ μ•Œμ•„λ³΄μž.


μš°μ„  기쀀이 λ˜λŠ” μš”μ†Œλ₯Ό id κ°’μœΌλ‘œ document.getElementById λ₯Ό 톡해 <body> νƒœκ·Έλ₯Ό λΆˆλŸ¬μ™€ λ³€μˆ˜ start 에 μ €μž₯ν•œλ‹€. μ΄μ–΄μ„œ ν•΄λ‹Ή λ³€μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ λ…Έλ“œ 객체의 속성 값을 λ°˜ν™˜ν•΄λ³Έλ‹€.

그런데 start 의 첫 번째 μžμ‹ μš”μ†Œλ₯Ό firstChild λ₯Ό 톡해 λΆˆλŸ¬μ™”λŠ”λ°, λ°˜ν™˜ κ°’μœΌλ‘œ <ul> νƒœκ·Έκ°€ μ•„λ‹Œ #text κ°€ λ°˜ν™˜λ˜μ—ˆλ‹€. μ΄μœ λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν•œ "λͺ¨λ“  μš”μ†Œκ°€ λ…Έλ“œμ— ν•΄λ‹Ήν•˜λ©°, 곡백과 주석도 λ§ˆμ°¬κ°€μ§€λ‹€" λΌλŠ” λΆ€λΆ„μ—μ„œ μ•Œ 수 μžˆλ‹€. ν•΄λ‹Ή HTML λ¬Έμ„œμ—μ„œ start 의 첫 번째 μžμ‹ μš”μ†ŒλŠ” body 와 <ul> 사이에 μžˆλŠ” 곡백이고, 그렇기에 #text λ₯Ό λ°˜ν™˜ν•œ 것이닀. λ§Œμ•½, <ul> νƒœκ·Έλ₯Ό μ§€μ •ν•˜κ³  μ‹Άμ—ˆλ‹€λ©΄ μ•„λž˜ 두 가지 방식을 ν™œμš©ν•˜λ©΄ λ˜λŠ” 것이닀.

μ΄λ ‡κ²Œ λ…Έλ“œ κ°„μ˜ 관계λ₯Ό ν™œμš©ν•˜μ—¬ μ—°κ΄€λœ λ…Έλ“œλ₯Ό μ§€μ •ν•˜μ—¬ ν™œμš©ν•  수 μžˆλ‹€. 자주 μ‚¬μš©ν•˜λŠ” 속성과 λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

속성

  • childNodes
  • firstChild
  • lastChild
  • nextSibling
  • parentNode
  • previousSibling

λ©”μ„œλ“œ

  • appendChild()
  • removeChild()
  • hasChildNodes()


λ‹€μŒμ˜ μ˜ˆμ‹œλ₯Ό 보면 더 이해가 νŽΈν•˜λ‹€.

개발자 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μš”μ†Œμ˜ 관계λ₯Ό 톡해 속성과 λ©”μ„œλ“œλ₯Ό ν™œμš©ν•΄λ³΄κ² λ‹€.


μ΅œμƒλ‹¨ λΆ€ν„° μ°¨λ‘€λ‘œ ν•΄μ„ν•΄λ³΄μž. μš°μ„  parent 클래슀λ₯Ό κ°–λŠ” μš”μ†Œ 쀑 첫 번째 μΈλ±μŠ€μ— μœ„μΉ˜ν•œ μš”μ†Œλ₯Ό λ³€μˆ˜ el 둜 μ§€μ •ν•œλ‹€. el 을 μž…λ ₯ν•˜λ‹ˆ μ˜¬λ°”λ₯΄κ²Œ div.parent κ°€ λ‚˜νƒ€λ‚œ 것을 확인할 수 μžˆλ‹€. ν•΄λ‹Ή λ…Έλ“œκ°€ 기쀀점이 λ˜μ–΄μ€„ 것이닀.

μ΄μ–΄μ„œ el 의 μžμ‹ μš”μ†Œμ˜ 갯수λ₯Ό el.childElementCount λ₯Ό 톡해 μ„Έ λ³΄λ‹ˆ 5 λΌλŠ” 값이 좜λ ₯λ˜λ©΄μ„œ μ•Œλ§žμ€ 갯수λ₯Ό 좜λ ₯ν•΄μ£Όμ—ˆλ‹€. μ΄μ–΄μ„œ el.firstElementChild λ₯Ό μ‚¬μš©ν•˜μ—¬ 첫 번째 μš”μ†Œλ₯Ό μ°Ύκ³ , ν•΄λ‹Ή μš”μ†Œμ—μ„œ 더 λ“€μ–΄κ°€ el.firstElementChild.nextElementSibling λ₯Ό 톡해 첫 번째 μš”μ†Œμ˜ ν˜•μ œ μš”μ†Œλ₯Ό μ°Ύμ•˜λ”λ‹ˆ μ•Œλ§žμ€ 값이 좜 됨을 확인할 수 μžˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ ν•΄λ‹Ή el 에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κΈ° μœ„ν•΄ const div = document.createElement('div') λ₯Ό 톡해 div νƒœκ·Έλ₯Ό ν•˜λ‚˜ μƒμ„±ν•œλ‹€. 그리고 ν•΄λ‹Ή div 에 classList λ₯Ό 톡해 child λΌλŠ” 클래슀λ₯Ό μΆ”κ°€ν–ˆμœΌλ©°, λ§ˆμ§€λ§‰μœΌλ‘œ el 에 λ§Œλ“€μ–΄ λ‘” div λ₯Ό μΆ”κ°€ν•˜κ³  innerText λ₯Ό ν™œμš©ν•˜μ—¬ ν•΄λ‹Ή div 내뢀에 6 μ΄λΌλŠ” ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν–ˆλ‹€. κ·Έλ ‡κ²Œ ν•΄λ‹Ή 결과와 같이 5개 μ˜€λ˜ μš”μ†Œλ“€μ΄ 6개둜 μΆ”κ°€λ˜μ—ˆκ³ , 같은 클래슀λ₯Ό λΆ€μ—¬ν•˜μ—¬ 같은 CSSκ°€ 적용 λ˜μ—ˆμŒμ„ 확인할 수 μžˆλ‹€.

λ…Έλ“œμ˜ 좔적과 μΆ”κ°€/생성


λ…Έλ“œμ˜ 좔적


μœ„ μ˜ˆμ‹œμ—μ„œ div.parent λ…Έλ“œλ₯Ό HTMLμ—μ„œ className 을 톡해 κ°€μ Έμ˜¨ 것을 확인할 수 μžˆλ‹€. μ΄λ ‡κ²Œ DOMμ—μ„œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ…Έλ“œλ₯Ό μ°Ύμ•„μ˜¬ 수 μžˆλŠ”λ°, κ·Έ 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

  • document.querySelector('selector')
  • document.querySelectorAll('selector')
  • document.getElementsByClassName('className')
  • document.getElementById('idName')


ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ„ ν™œμš©ν•˜μ—¬ DOM λ…Έλ“œλ“€μ„ νŠΉμ • κΈ°μ€€μœΌλ‘œ 뢈러올 수 μžˆλ‹€.


각 λ©”μ„œλ“œμ˜ ν™œμš© 방법과 λ°˜ν™˜ 값을 μ•Œ 수 μžˆλŠ” μ˜ˆμ‹œλ‹€. ν•΄λ‹Ή μ˜ˆμ‹œλŠ” μœ„ μ˜ˆμ‹œμ—μ„œ div.child 의 λ§ˆμ§€λ§‰ μš”μ†Œλ§Œ div#lastChild 둜 λ°”κΎΌ λ’€ μ§„ν–‰ν•œ μ˜ˆμ‹œλ‹€. μœ„ λ©”μ„œλ“œλ“€μ€ 인자의 ν˜•μ‹μ΄λ‚˜ λ°˜ν™˜ κ°’μ˜ ν˜•μ‹μ— 따라 κ΅¬λΆ„λœλ‹€.

μš°μ„  인자 ν˜•μ‹μ— 따라 document.querySelector('selector') , document.querySelectorAll('selector') 은 μ„ νƒμž μž‘μ„± λ°©μ‹μœΌλ‘œ 인자 값을 μ‚¬μš©ν•œλ‹€. ν•˜μ§€λ§Œ document.getElementsByClassName('className') , document.getElementById('idName') 의 κ²½μš°λŠ” 클래슀 λͺ…, ID λͺ…을 λ°”λ‘œ μž‘μ„±ν•œλ‹€λŠ” 차이점이 μžˆλ‹€.

그리고 λ°˜ν™˜ κ°’μ˜ ν˜•μ‹μ— 따라 document.querySelector('selector') , document.getElementById('idName') 은 단일 값을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ—, λ…Έλ“œ ν•˜λ‚˜ λ§Œμ„ λ°˜ν™˜ν•˜κ³  μΌμΉ˜ν•˜λŠ” λ…Έλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 null 을 λ°˜ν™˜ν•˜μ§€λ§Œ, document.querySelectorAll('selector') , document.getElementsByClassName('className')의 경우 볡수의 값을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— 인덱슀 값을 [i] 을 톡해 μž…λ ₯ν•΄μ•Ό ν•˜κ³  값이 없을 λ•Œλ„ 빈 배열을 λ°˜ν™˜ν•œλ‹€λŠ” 차이가 μžˆλ‹€.

μ΄λ ‡κ²Œ λ…Έλ“œλ₯Ό μΆ”μ ν•˜μ—¬ νŠΉμ • μœ„μΉ˜μ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

κ·Έλ ‡λ‹€λ©΄ μ˜ˆμ‹œ 일뢀λ₯Ό μΆ”μΆœν•˜μ—¬ μš”μ†Œ 생성과 μΆ”κ°€μ˜ 과정을 μ„€λͺ…ν•΄λ³΄μž.

μš°μ„  div λΌλŠ” λ³€μˆ˜μ— createElement λΌλŠ” λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ div νƒœκ·Έ λ…Έλ“œλ₯Ό μƒμ„±ν•˜κ³  μ €μž₯ν•œλ‹€. 그리고 ν•΄λ‹Ή div 값에 classList λ₯Ό 톡해 ,child λΌλŠ” 클래슀λ₯Ό λΆ€μ—¬ν•΄μ€€λ‹€. 이후 μ•žμ—μ„œ μ„ μ–Έν•΄ μ€€ el 에 append λ₯Ό 톡해 div λ³€μˆ˜λ₯Ό μΆ”κ°€ν•œλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ innerText λ₯Ό 톡해 el 의 λ§ˆμ§€λ§‰ μžμ‹ μš”μ†Œμ— 6 μ΄λΌλŠ” 값을 μΆ”κ°€ν•œλ‹€.

μœ„μ—μ„œ κ°•μ‘° ν‘œμ‹œν•œ 생성과 좔가에 λŒ€ν•΄ μ΄μ–΄μ„œ μ•Œμ•„λ³΄μž.

λ…Έλ“œμ˜ 생성 및 μΆ”κ°€


생성

  • createElement()
  • createTextNode()

μΆ”κ°€

  • innerHTML/Text = input
  • outerHTML/Text = input
  • textContent = input
  • insertAdjacentHTML()

μœ„ μ˜ˆμ‹œλ₯Ό 보면 각각의 λ°©λ²•μœΌλ‘œ 생성을 μ§„ν–‰ν•˜κ³  좔가도 μ§„ν–‰ν•œ λ‚΄μš©μ΄λ‹€. createElement() 의 κ²½μš°μ—” μ•ž μ „μ˜ μ˜ˆμ‹œμ—μ„œ μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— μ œμ™Έν•˜μ˜€λ‹€.

μš°μ„  createElement() 와 createTextNode() 의 경우 μ„ μ–Έκ³Ό λ™μ‹œμ— λ³€μˆ˜μ— μ €μž₯되고 κ°’μ˜ ν˜•νƒœμ˜ 경우, μ „μžλŠ” element λ…Έλ“œ ν˜•νƒœλ‘œ, ν›„μžμ˜ 경우 Text λ…Έλ“œ ν˜•νƒœλ‘œ μ €μž₯λœλ‹€.

그리고 총 λ„€ κ°€μ§€μ˜ μΆ”κ°€ 방법을 μž‘μ„±ν–ˆλŠ”λ°, innerHTML/Text 은 λ…Έλ“œ μš”μ†Œ 내뢀에, outerHTML/Text 의 경우 νƒœκ·Έ 전체λ₯Ό κ°±μ‹ ν•˜λ©° κΈ°μ‘΄ νƒœκ·Έκ°€ 사라진닀고 μƒκ°ν•˜λ©΄ λœλ‹€. textContent λŠ” Text μš”μ†Œλ₯Ό μƒμ„±ν•˜μ—¬ κ°±μ‹ ν•˜κ³ , λ§ˆμ§€λ§‰ insertAdjacentHTML() 의 κ²½μš°μ—” element λ…Έλ“œμ—μ„œλ§Œ λ™μž‘ν•˜λ©° 인자 값이 두 가지가 λ“€μ–΄κ°€λŠ”λ°, (location, 'textStyleTag') 둜 κ΅¬μ„±λ˜λ©° μ•žμ—” 정해진 ν‚€μ›Œλ“œ(beforeend λ“±)λ₯Ό 인자둜 κ°–κ³  λ’€μ—” outerHTML μž‘μ„±κ³Ό 같이 전체 λ…Έλ“œ ν˜•μ‹μ„ μž‘μ„±ν•œλ‹€.

이외에도 μΆ”κ°€μ—λŠ” 두 가지 방법이 더 μžˆλ‹€.

μ•žμ˜ 방식듀은 λŒ€λΆ€λΆ„ λ…Έλ“œ 값을 κ°±μ‹ ν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€λ©΄, μœ„ 두 가지 방법은 μš”μ†Œλ₯Ό μ§€μš°μ§€ μ•Šκ³  μΆ”κ°€λ₯Ό μ§„ν–‰ν•œλ‹€. appendChild() 의 경우 μΆ”κ°€ν•˜κ³ μž ν•˜λŠ” λ…Έλ“œλ₯Ό ν•΄λ‹Ή μš”μ†Œμ˜ 맨 끝 μžμ‹ μš”μ†Œλ‘œ μΆ”κ°€ν•œλ‹€. λ°°μ—΄ λ©”μ„œλ“œμ˜ push() 와 같은 ꡬ쑰라고 μƒκ°ν•˜λ©΄ νŽΈν•  것 κ°™λ‹€.


insertBefore() 의 경우 인자 κ°’μœΌλ‘œ 두 가지λ₯Ό λ°›λŠ”λ°, (element, location) 의 ν˜•νƒœλ‘œ λ°›κ²Œ λœλ‹€. μš°μ„  μΆ”κ°€ν•˜κ³ μž ν•˜λŠ” μš”μ†Œλ₯Ό λ°›κ³ , 이후 경둜λ₯Ό μ§€μ •ν•˜μ—¬ ν•΄λ‹Ή μš”μ†Œ κΈ°μ€€μœΌλ‘œ μ•žμ— μœ„μΉ˜ν•œλ‹€. μ΄λ ‡κ²Œ μœ μ—°ν•œ λ°©μ‹μœΌλ‘œ λ…Έλ“œλ₯Ό μΆ”κ°€ν•  수 도 μžˆλ‹€.

λ…Έλ“œμ˜ μ œκ±°μ™€ λ³€κ²½


λ…Έλ“œμ˜ 생성과 μΆ”κ°€κ°€ μ΄λ£¨μ–΄μ‘ŒμœΌλ©΄, μ œκ±°μ™€ 변경도 κ°€λŠ₯ν•  것 μž„μ„ 이미 μ§μž‘ν–ˆμ„ 것이닀. μ œκ±°μ™€ 변경은 λ‹€μŒκ³Ό 같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 진행할 수 μžˆλ‹€.

제거

  • removeChild()

λ³€κ²½

  • replaceChild()

μš°μ„  제거의 경우 removeChild() 와 같이 상속 관계λ₯Ό ν™œμš©ν•˜μ—¬ 진행할 수 μžˆλ‹€. 이 경우 ν•΄λ‹Ή λ…Έλ“œμ˜ parentNode ν˜Ήμ€ parentElement λ₯Ό μ°Έμ‘°ν•˜μ—¬ 제거λ₯Ό 진행할 수 μžˆλ‹€.

변경도 μ œκ±°μ™€ 같이 상속 관계λ₯Ό ν™œμš©ν•˜λ©΄μ„œ, 인자λ₯Ό 두 가지λ₯Ό λ°›λŠ”λ‹€. μΈμžλŠ” (inputElement, location) 으둜 location 에 inputElement λ₯Ό λŒ€μž…ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. μœ„ μ˜ˆμ‹œμ˜ 경우 parent 의 λ§ˆμ§€λ§‰ μžμ‹ μš”μ†Œλ₯Ό μ§€μ •ν•˜μ—¬ λ³€κ²½ν•œ λͺ¨μŠ΅μ΄λ‹€.

λ…Έλ“œμ˜ 볡제


νŠΉμ • λ…Έλ“œμ˜ ꡬ쑰λ₯Ό λ³΅μ œν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. κ·Έλ ‡κ²Œ λœλ‹€λ©΄, 같은 ꡬ쑰의 λ…Έλ“œλŠ” 반볡적으둜 생성할 ν•„μš”κ°€ μ—†λŠ” 것이닀. λ³΅μ œλŠ” λ‹€μŒμ˜ λ°©λ²•μœΌλ‘œ 진행할 수 μžˆλ‹€.

볡제

  • cloneNode()

ν•΄λ‹Ή μ˜ˆμ‹œλ₯Ό 보면 parent λ…Έλ“œ 자체만 λ³΅μ‚¬ν•œ κ²½μš°μ™€, λ…Έλ“œ 전체λ₯Ό λ³΅μ‚¬ν•œ κ²½μš°κ°€ κ΅¬λΆ„λ˜μ–΄ μžˆλ‹€. cloneNode() λ©”μ„œλ“œμ˜ 경우, νŠΉμ • λ…Έλ“œλ₯Ό λ³΅μ œν•˜λŠ”λ° 인자 값에 따라 전체λ₯Ό 볡사할 지, 단일 μš”μ†Œλ§Œ 볡사할 지λ₯Ό ꡬ뢄할 수 μžˆλ‹€.

cloneOne 의 경우 인자 값을 λΆ€μ—¬ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—, parent λ…Έλ“œ 단일 객체 λ§Œμ„ λ³΅μ œν–ˆμ§€λ§Œ, cloneAll 의 경우 인자 값에 true λ₯Ό μΆ”κ°€ν•˜μ—¬ ν•΄λ‹Ή λ…Έλ“œμ˜ μžμ‹ μš”μ†Œλ“€κΉŒμ§€ μ „λΆ€ λ³΅μ œν•˜μ˜€λ‹€.

마무리 🧾


μ™„λ²½ν•˜κ²Œ ν•΄λ‹Ή 책을 λ…νŒŒν•˜κ³  전체λ₯Ό μ •λ¦¬ν•˜μ—¬ μž‘μ„±ν•˜κ³  μ‹Άμ—ˆμ§€λ§Œ, λΆ€νŠΈμΊ ν”„ 컀리큘럼과 λ™μ‹œμ— μ§„ν–‰ν•˜κ³ μž ν•˜λ‹ˆ μ•½κ°„ λ²„κ±°μ›Œ λ‚΄κ°€ μ‹€μ œλ‘œ ν™œμš©ν–ˆλ˜ 뢀뢄에 λŒ€ν•΄μ„œ μž‘μ„±ν•˜λŠ” 것을 1μ°¨ λͺ©ν‘œλ‘œ 두고 기쑴의 μž‘μ„± λͺ©λ‘μ„ λ§ˆλ¬΄λ¦¬μ§€μ—ˆλ‹€.

μ΄μ–΄μ„œ λ¦¬μ•‘νŠΈλ₯Ό 진행할 μ˜ˆμ •μ΄μ§€λ§Œ, 바닐라 μžλ°”μŠ€ν¬λ¦½νŠΈ λ˜ν•œ λ†“μΉ˜μ§€ μ•Šκ³  κΎΈμ€€νžˆ 곡뢀해야 함을 λͺ…μ‹¬ν•˜μž.

πŸ”– μ°Έκ³ 

DOM : MDN Web Docs : DOM μ†Œκ°œ + 각쒅 λ©”μ„œλ“œλ“€

profile
μ΄μœ μ— μ§‘μ°©ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ 개발자 μ§€λ§μƒμž…λ‹ˆλ‹€ 🧐

0개의 λŒ“κΈ€