ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node와 Element Node그리고 childNodes, children
    javascript ES5 정리 2020. 9. 28. 13:42

    node 트리 구조

    노드 트리 구조

     

    위 트리구조는 노드 트리구조이다 가장 상위에 document객체가 있고 아래로 트리모양으로 node들이 분포된다.

     

    js에서는 노드들을 불러올때 해당 노드의 하위 즉 자식 노드들을 속성을 사용하여 불러올 수 있다.

     

    html

      <section id="sec5">
          <div class="box">
            <input type="text" value="0" class="textx">
            <input type="text" value="0" class="texty">  
          </div>     
        </section>

    다음과 같은 section이 하나 주어진다.

    div 노드의 자식 노드에는 input 노드가 2개 존재한다.

     

    우리는 이 자식노드들을 children속성을 사용하여 불러올 수 있다.

     

    js

    window.addEventListener("load", function(){
       var sec5 = document.querySelector("#sec5");
       var box = sec5.querySelector(".box");
    
       var input1 = box.childNodes[0];
       var input2 = box.childNodes[1];
    
       input1.value = "hello";
       input2.value = "okay";
     
       
    });

    querselector를 사용하여 id = sec5 노드를 불러왓고 해당 노드의 box class 노드를 box에 넣어두었다.

     

     

     

    box에는 div = "box" 노드가 들어가있다.

     

    이때

     

    children 속성을 사용하면 해당노드의 자식노드들을 볼러올 수 있다.

     

    해당 프로그램을 실행해 보았다.

    결과

    결과가 이상하다는것을 알 수 있다.

    분명히 input노드에 각각 hello와 okay를 넣어주었는데 input1에 okay값이 들어가있고 input2에는 값이 존재하지도 않는다. 왜이런 현상이 일어나는것일까?

     

    다시 위의 트리구조를 보면 #comment, #text 즉 주석과 text또한 모두 node로 취급한다. 

     

    이말은 즉 

     

    <div class = "box">뒤의 공백또한 자식 노드로 취급된다는 소리이다. 결국 배열0번에는 빈공간text가 들어가있고

    배열1번에 <input type="text" value="0" class="textx"> 이 값이 들어가있는것이다.

     

    그럼 어떻게 하면 제대로된 값을 넣고 출력할 수 있을까?

     

      <section id="sec5">
          <div class="box"><input type="text" value="0" class="textx"><input type="text" value="0" class="texty">     
          </div>     
        </section>

    이렇게 빈공백 없이 노드들을 딱 붙여 코드를 작성해면 값이 제대로 기입된다.

     

    결과

    하지만 이는 가독성이 매우 좋지않은 코드이다.

     

    이를 해결하기 위해선

    children 속성을 사용하면된다.

     

    html

    <section id="sec4">
          <div class="box">
            <input type="text" value="0" class="textx">
            <input type="text" value="0" class="texty">  
          </div>     
        </section>

     

    js

    window.addEventListener("load", function(){
       var sec4 = document.querySelector("#sec4");
       var box = sec4.querySelector(".box");
    
       var input1 = box.children[0];
       var input2 = box.children[1];
    
       input1.value = "hello";
       input2.value = "okay";
     
       
    });

     

    결과

     

    결과적으로

    children 속성은 태그 속성 (태그 노드)들만을 자식노드로 취하고

    childNodes 속성은 주석과 text등 모든 노드를 자식으로 취하는 속성입니다.

     

    때에따라 알맞은 속성을 사용하면 js를 유동적으로 사용할 수 있습니다.

    'javascript ES5 정리' 카테고리의 다른 글

    img 변경 예제  (0) 2020.09.28
    node의 종류와 개체 형식  (0) 2020.09.28
    js selector api 사용하여 객체 가져오기  (0) 2020.09.24
    class 를 사용하여 객체 가져오기  (0) 2020.09.24
    js getElementsByTagname  (0) 2020.09.23
Designed by Tistory.