본문 바로가기
프로그래밍 개발/JS 웹

Javascript Node 객체 - 노드 종류 API

by Jinseok Kim 2020. 11. 20.
반응형

 

 

노드 종류 API

 

 

 

노드 작업을 하게 되면 현재 선택된 노드가 어떤 타입인지를 판단해야 하는 경우가 있다. 이런 경우에 사용할 수 있는 API가 nodeType, nodeName이다.

 

 

  • Node.nodeType : node의 타입을 의미한다. 
  • Node.nodeName : node의 이름 (태그명을 의미한다.)

 

 

 

 

 

Node Type

 

노드의 종류에 따라서 정해진 상수가 존재한다. 

 

for(var name in Node){
   console.log(name, Node[name]);
}

결과

ELEMENT_NODE 1 
ATTRIBUTE_NODE 2 
TEXT_NODE 3 
CDATA_SECTION_NODE 4 
ENTITY_REFERENCE_NODE 5 
ENTITY_NODE 6 
PROCESSING_INSTRUCTION_NODE 7 
COMMENT_NODE 8 
DOCUMENT_NODE 9 
DOCUMENT_TYPE_NODE 10 
DOCUMENT_FRAGMENT_NODE 11 
NOTATION_NODE 12 
DOCUMENT_POSITION_DISCONNECTED 1 
DOCUMENT_POSITION_PRECEDING 2 
DOCUMENT_POSITION_FOLLOWING 4 
DOCUMENT_POSITION_CONTAINS 8 
DOCUMENT_POSITION_CONTAINED_BY 16 
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC 32

 

 

 

 

 

 

 

 

함수가 자기 자신을 호출하는 하는 재귀함수와 노드 종류 API를 이용해서 노드를 처리하는 예제

<!DOCTYPE html>
<html>
<body id="jinseok">
<ul>
    <li><a href="./532">html</a></li> 
    <li><a href="./533">css</a></li>
    <li><a href="./534">JavaScript</a>
        <ul>
            <li><a href="./535">JavaScript Core</a></li>
            <li><a href="./536">DOM</a></li>
            <li><a href="./537">BOM</a></li>
        </ul>
    </li>
</ul>
<script>
function traverse(target, callback){
    if(target.nodeType === 1){
        //if(target.nodeName === 'A')
        callback(target);
        var c = target.childNodes;
        for(var i=0; i<c.length; i++){
            traverse(c[i], callback);       
        }   
    }
}
traverse(document.getElementById('jinseok'), function(elem){
    console.log(elem);
});
</script>
</body>
</html>

 

  • traverse라는 이름을 가지고 있는 함수의 첫 번째 인자로 target 이름을 주었고, 두 번째 인자로 callback 이름을 주었다. 
  • 그리고 traverse의 이 두 개의 인자 변수에 document.getElementById('jinseok'), function(elem)을 각각 전해 주었다. 여기서 function(elem) 함수를 받은 traversse 함수의 두 번째 인자 callback은 함수 내부에서 traverse의 드번 째 인자인 자기 자신의 함수 function(elem)를 내부에서도 호출하게 하는 재귀함수를 쓰기 위함을 의미한다.
  • 이렇게 볼 수 있다. callback=function(elem) 매개변수이다. 즉 함수 내부에서 callback(target); 사용하여 target이 function(target)이 내부로 들어오게 된다. ※ 여기서 function(elem)은 전체 엘리먼트를 탐색하기 위함의 기능이다.
  • 또 다른 의미로 표현하자면 document.getElementById('jinseok')을 담고 있으면서도 traverse의 자기 자신의 첫 번째 인자 함수인 targettraverse 함수 자기 자신 내부로 불러낸 것으로도 볼 수 있다. 이 과정이 재귀함수이다.
  • 다음으로 for문을 이용하기 위해 id값이 jinseok인 body을 품고있는 target 변수 .childNodes을 해주어 body의 하위 자식들을 배열화해주고 c로 변수선언을 해주었다.
  • 그리고 for문을 이용하여 body 자식들을 배열화한 것을 for문의 인수 조건대로 흝고 지나가게 하도록 for문의 반복되어 실행될 코드로 위의 선언된 재귀함수를 이용하여 traverse(c[i], callback)을 설정한다.
  • 마지막으로 더 효율을 높이기 위하여 target 변수에 담겨있는 body안의 모든 node들 중 ELEMENT_NODE만 포함되게 하기 위해 if(target.nodeType === 1)을 설정해준다. 혹은 a태그만을 포함되게 하고 싶으면 if(target.nodeName === 'A')을 설정해 주면된다. 이를 설정해주면 body안의 모든 node(#text같이 눈에 보이지 않는 띄어쓰기 node 요소들 등등)을 포함하지 않아도 된다.

 

 

 

 

 

 

 

반응형

댓글