본문 바로가기
Web/JavaScript

09. 문서객체모델, 노드(Node)

by 사라리24 2024. 4. 16.
SMALL

 

1. Document 객체

Dom(Document Object Model)
HTML문서 혹은 XML문서 등을 접근하기 위한 일종의 인터페이스 역할
* XML 문서 : Extensible Markup Language_ 데이터를 저장하고 전송하기 위한 마크업 언어

문서 내의 모든 요소를 정의하고 각각의 요소에 접근하는 방법을 제공
웹 페이지 자체(Body)를 의미하는 객체
웹 페이지에 존재하는 HTML 요소에 접근하고자 할 때 반드시 document 객체로부터 시작

 

  • getElementById(): 해당 아이디의 요소를 선택 (단수객체 저장)
  • getElementsByTagName(): 해당 태그 이름의 요소를 모두 선택 (복수객체저장) ex)p, ankor.... --->배열로 저장
  • getElementsByClassName(): 해당 클래스에 속한 요소를 모두 선택
  • getElementsByName(): 해당 name 속성값을 가지는 요소를 모두 선택
  • querySelectorAll(): 선택자로 선택되는 요소를 모두 선택 (모두선택)
  • querySelector(): 선택자로 선택되는 요소를 선택 (한개만 선택)

 

  • 문서 객체 사용하기

     
        <body>

                 <h2>
문서 객체 모델 1  </h2>

                 <ul>
                     <li name="markup">HTML</li>
                     <li>CSS</li>
                     <li id="javascript" class="js">Javascript</li>
                     <li class="js">React</li>
                     <li class="backend">Apache</li>
                     <li class="backend">NgineX</li>
                     <li id="nodejs" class="js">Node.js</li>
                     <li id="vue" class="js">Vue</li>
                 </ul>

                    <script>     

                       // 요소 : 'li' 모두 찾기
                       const tagName = document.getElementsByTagName('li');
                       for(let i=0; i<tagName.length; i++){
                           console.log(tagName[i]);  
                           tagName[i].style.color = 'gold'
                       }
                       console.log('---------------');

                       //class : 'js' 찾기 모두 찾기
                       const className = document.getElementsByClassName('js');
                       for(let i=0; i<className.length; i++){
                           console.log(className[i]);
                           className[i].style.color = 'deeppink';
                       }

                       //id : 'javascript' 하나 찾기
                       console.log('---------------');
                       const id=document.getElementById('javascript');
                       console.log(id)
                       id.style.color='greenyellow';

                       //name : markup 모두 찾기
                       console.log('---------------');
                       const name = document.getElementsByName('markup');
                       for(let i=0; i<name.length; i++){
                           console.log(name[i]);
                           name[i].style.color = 'deepskyblue';
                       }

                       //li>class가 backend 모두 찾기
                       console.log('---------------');
                       const qsa = document.querySelectorAll('li.backend');
                       for(let i=0; i<qsa.length; i++){
                           console.log(qsa[i]);
                           qsa[i].style.color = 'navy';
                       }


 
                    </script>     

        </body>








 

 

 

 

2. 노드 (Node)

HTML DOM은 노드라고 불리는 계층적 단위에 정보를 저장

 

  • 노드 종류
    - 문서 노드: 문서 전체를 나타내는 노드

    - 요소 노드: HTML의 모든 요소는 요소 노드, 속성 노드를 가질 수 있음
    - 속성 노드: HTML의 모든 속성은 속성 노드, 속성 노드에 관한 정보를 가지고 있음
    - 텍스트 노드: HTML 모든 텍스트는 텍스트노드
    - 주석 노드: HTML 모든 주석은 주석노드

  • 노드의 관계
     parentNode: 부모 노드
     children: 자식 노드
    -  childNodes: 자식 노드 리스트
     firstChild: 첫번째 자식 노드
    -  firstElementChild: 첫번째 자식 요소 노드
     firstChild: 첫번째 자식 노드
    -  nextSibling: 다음 형제 노드
     previousSibling: 이전 형제 노드
     lastChild: 마지막 자식 노드

 

  • 노드 사용하기 

     
        <body>

                 <h2> 
문서 객체 모델 2 </h2>

                  <script>    
 

                    // 웹페이지 열기 event가 실행될 시 실행될 함수
                     window.onload = function(){
                         const gnb = document.getElementById('gnb'); //gnb 객체 가져오기
                         console.log(gnb);                            //<nav> 태그
                         console.log(gnb.parentNode);   // 부모노드 : <div>
                         console.log(gnb.children[0]);    // 자식노드(0) : <ul>
                         console.log(gnb.children[1]);    // 자식노드(1) : undifined
                         console.log(gnb.children[0].children[0]);  
                         //  자식노드(0-0) <li> 내용1
                         console.log(gnb.children[0].children[0].nextElementSibling);
                         // (0-0) 다음 형제: <li> 내용2
                         console.log(gnb.children[0].firstChild);
                         // 자식노드(0-firstChild) // <li> 내용1 (X) // text (o)
                        // firstChild, nextSibling 공백도 요소에 포함
                         console.log(gnb.children[0].firstElementChild);
                         //  자식노드(0-firstElementChild) <li> 내용1 (o)    
                         // 공백 쓸거라면 firstElementChild 쓰기
 
                   </script>     

                 <div>
                     <nav id="gnb">
                         <ul>
                             <li>내용 1</li>
                             <li>내용 2</li>
                             <li>내용 3</li>
                         </ul>
                     </nav>
                 </div>
        </body>





 

 

 

3. 노드 메서드

HTML DOM은 노드라고 불리는 계층적 단위에 정보를 저장

 

  • 노드 추가
    • appendChild(): 새로운 노드를 해당 노드의 자식 노드 리스트 맨 마지막에 추가
    • insertBefore(): 새로운 노드를 특정 자식 노드 바로 앞에 추가
    • insertData(): 새로운 노드를 텍스트 데이터로 추가

     
        <body>

                 <h2>
노드추가 </h2>

                  <script>   
  
                     //appendChild(): 새로운 노드를 해당 노드의 자식 노드 리스트 맨 마지막에 추가

                     function appendNode(){
                          const parent= document.getElementById('list');
                          console.log(parent);
                          const newItem=document.getElementById('item1');
                          console.log(newItem);
                          parent.appendChild(newItem); //newItem이 list의 자식으로 들어가기
                      }
   
                      //insertBefore(): 새로운 노드를 특정 자식 노드 바로 앞에 추가
                      function insertNode(){
                          const parent= document.getElementById('list');
                          const backend=document.getElementById('backend');
                          const newItem=document.getElementById('item2');
                          parent.insertBefore(newItem,backend); //newItem이 list의 자식 앞으로 들어가기
                      }

                 //insertData(): 새로운 노드를 텍스트 데이터로 추가
                      function appendText(){
                          const text=document.getElementById('text').firstChild;
                          console.log(text);
                          text.insertData(7, '아주 피곤한 월요일 ');
                      }
 
                       </script>     

                           <h2 id="cl">node</h2>
                           <div id="list">
                               <p id="backend">node.js</p>
                               <p>HTML</p>
                               <p>CSS</p>
                           </div>

                           <p id="item2">React</p>
                           <p id="item1">JavaScript</p>
                           <hr>
                           <p id="text">현재 시간은 오후 3시입니다.</p>

   
                        <button onclick="appendNode()">노드추가1</button>
                        <!-- JavaScrip가 React 위로 -->
                        <button onclick="insertNode()">노드추가2</button>
                        <!-- React가 맨 위로 -->
                        <button onclick="appendText()">텍스트노드추가</button>
                        <!-- 7번째 인덱스에 '아주 피곤한 월요일' 추가 -->

        </body>






[ 실행창 ]




[ 노드추가1 ] 클릭




[ 노드추가 2 ]  클릭




[ 텍스트 노드추가 ] 클릭

 

 

 

  • 노드 생성
    • createElement: 새로운 요소 노드를 만들다
    • createAttribute: 새로운 속성 노드을 만들다
    • createTextNode: 새로운 텍스트 노드를 만들다

     
        <body>

                 <h2> 노드생성  </h2>


                  <script>     


                 // createElement(): 새로운 요소 노드를 만들다
                     function createNode(){
                         const newItem=document.getElementById('item1'); //id:item:javascript
                         const newNode=document.createElement('p');
                         // 가상의 <p>태그 //(메모리에만 존재)를 만들어줌
                         newNode.innerHTML='<strong> 😎새로운 요소가 추가됨</strong>'
                         //<p><strong> 😎새로운 요소가 추가됨</strong></p>
                         // innerHTML: HTML 요소의 텍스트 삽입
                         // innerText: 텍스트만 삽입
                       document.body.insertBefore(newNode,newItem);                 
                         //newItem 앞에 newnode 넣기
                       }

                   // createAttribute(): 새로운 속성 노드를 만듦
                    function createAttr(){
                        const newItem=document.getElementById('item2');//id:item2:React
                        const newAttr=document.createAttribute('style'); // style=''
                       newAttr.value='color:deeppink; background-color:gold;'
                      //style='color:deeppink; background-color:gold;'
                       newItem.setAttributeNode(newAttr);
                      // <p id"item2" style='color:deeppink; background-color:gold;'>Recat</p>
                    }
 
                 //createTextNode: 새로운 텍스트 노드를 만듦
                  function createText(){
                     const textNode=document.getElementById('ct');
                     const newText=document.createTextNode('😎😍🤗🙂😘😊😙🙂');
                     textNode.appendChild(newText);
                    }


 
                       </script>     

                           <h2 id="cl">node</h2>
                           <div id="list">
                               <p id="backend">node.js</p>
                               <p>HTML</p>
                               <p>CSS</p>
                           </div>

                           <p id="item2">React</p>
                           <p id="item1">JavaScript</>
                           <hr>
                           <p id="text">현재 시간은 오후 3시입니다.</p>

                           <p id="ct"></p>
                         <hr>
                         <button onclick="createNode()">노드생성</button>
                         <!--JavaScript 위 : 😎새로운 요소가 추가됨
-->
                         <button onclick="createAttr()">속성노드생성</button>
                         <!-- React style 속성 생성 -->
                         <button onclick="createText()">텍스트노드생성</button>
                         <!--id=ct  밑 : 😎😍🤗🙂😘😊😙🙂
추가 -->


        </body>




[ 노드생성 ] 한번 클릭




[ 노드생성 ] 두번 클릭



[ 속성노드생성 ] 클릭



[ 텍스트노드생성 ] 한번 클릭




[ 텍스트노드생성 ] 여러번 클릭



  • 노드 제거
    • removeChild(): 자식 노드 리스트에서 특정 자식 노드를 제거.
      노드가 제거되면 해당 노드를 반환
      노드가 제거될 떄 노드의 자식도 같이 제거
    • removeAttribute(): 특정 속성 노드를 제거

 

  • 노드 복제
    • clonenode(): 기존의 존재하는 노드와 동일한 새로운 노드를 생성하여 반환

     
        <body>

                 <h2>
노드삭제,복제  </h2>

                    <script>     

                 

                         //removeChild(): 자식 노드 리스트에서 특정 자식 노드를 제거.
                        function removeNode() {
                            const parent = document.getElementById('list');
                            const removeItem = document.getElementById('backend');
                            const result = parent.removeChild(removeItem)//backend 지워짐
                            console.log(result);
                        }


                   // createAttribute(): 새로운 속성 노드를 만듦
                    function createAttr(){
                        const newItem=document.getElementById('item2');//id:item2:React
                        const newAttr=document.createAttribute('style'); // style=''
                       newAttr.value='color:deeppink; background-color:gold;'
                      //style='color:deeppink; background-color:gold;'
                       newItem.setAttributeNode(newAttr);
                      // <p id"item2" style='color:deeppink; background-color:gold;'>Recat</p>
                    }


                         //removeAttribute(): 특정 속성 노드를 제거
                         function removeAttr() {
                             const newItem = document.getElementById('item2');
                             newItem.removeAttribute('style');
                         }

                          //clonenode(): 기존의 존재하는 노드와 동일한 새로운 노드를 생성하여 반환
                         function cloneElement() {
                             const parent = document.getElementById('list');
                             const originItem = document.getElementById('cl');
                             parent.appendChild(originItem.cloneNode(true));
                         }

                       </script>     

                           <h2 id="cl">node</h2>
                           <div id="list">
                               <p id="backend">node.js</p>
                               <p>HTML</p>
                               <p>CSS</p>
                           </div>

                           <p id="item2">React</p>
                           <p id="item1">JavaScript</p>
                           <hr>
                           <p id="text">현재 시간은 오후 3시입니다.</p>

                           <p id="ct"></p>
                         <hr>
   
                         <button onclick="removeNode()">노드삭제</button>
                         <!-- node.js 삭제 -->
                         <button onclick="createAttr()">속성노드생성</button>
                         <!-- React style 속성 생성 -->
                         <button onclick="removeAttr()">속성노드삭제</button>
                         <!-- React style 속성 삭제 -->
                         <button onclick="cloneElement()">노드복제</button>
                         <!-- node 복제 -->

        </body>


 

[ 노드삭제 ] 클릭




[ 노드 속성 생성 ] 클릭


[ 노드 속성 삭제 ] 클릭


[ 노드 복제 ] 클릭

 

 

'Web > JavaScript' 카테고리의 다른 글

11. 이벤트(Event)  (0) 2024.04.18
10. 정규표현식(Regular Expression: Regex)  (0) 2024.04.16
08. 내장객체  (0) 2024.04.16
07. 객체(Object)  (0) 2024.04.16
06. 함수(Function)  (0) 2024.04.16