자바스크립트 appendChild 에러가 발생합니다.

조회수 15455회

<ul> 태그안에 <li> 태그로 XML 노드의 을 추가 하고싶습니다. xmlDoc.documentElement.childNodes; 코드로 루트 노드(<person>)의 자식노드(<name>, <address>, <phone>)를 찾은 뒤, 반복문으로 <li> 태그를 생성하고 각각 자식노드 값(x[i].childNodes[0].nodeValue;)들을 넣어 줬습니다. 그리고 ul.appendChild(li); 코드로 <ul> 태그안에 추가를 하려고 하는데 에러가 발생합니다.

console.log(x[i].childNodes[0].nodeValue); 코드로 값이 정확한지 확인해보니 각 노드 값들이 정확하게 지정되어 있었습니다. 뭐가 문제인지 조언 부탁드립니다.


Uncaught TypeError: Cannot read property 'appendChild' of null


<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var text="<person>";
        text +=  "<name>name1</name>";
        text +=  "<address>address1</address>";
        text +=  "<phone>phone1</phone>";
        text +=  "</person>";

        if (window.DOMParser)
        {
            parser=new DOMParser();
            xmlDoc=parser.parseFromString(text,"text/xml");
        }
        else // 인터넷 익스플로러
        {
            xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async=false;
            xmlDoc.loadXML(text); 
        } 

        x=xmlDoc.documentElement.childNodes;

        var ul = document.getElementById("u");

        for(var i in x){
            var li = document.createElement("li");
            li.innerHTML = x[i].childNodes[0].nodeValue;
            console.log(x[i].childNodes[0].nodeValue);
            ul.appendChild(li);
        }
    </script>
</head>
<body>
    <ul id="u">
    </ul>
</body>
</html>
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 돌려보니 ul이 undefined로 나오는데요.

    원인은 스크립트가 실행되는 시점에 아직 <ul>태그를 브라우저가 읽지 않았기 때문입니다. 정확하게는 <ul>태그를 랜더링 하면서 DOM 객체로 생성하기 전에 스크립트가 실행되었기 때문이죠.

    아래처럼 스크립트가 <ul>보다 아래에 위치하도록 해보세요. 혹은 window.onload를 활용하는 방법도 있습니다.

    <!DOCTYPE html>
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <ul id="u"></ul>
    <script type="text/javascript">
        // 이 스크립트가 HTML 로드가 끝난 후 실행되도록 하세요
        var text = "<person>";
        text += "<name>name1</name>";
        text += "<address>address1</address>";
        text += "<phone>phone1</phone>";
        text += "</person>";
    
        if (window.DOMParser) {
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(text, "text/xml");
        } else // 인터넷 익스플로러
        {
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(text);
        }
    
        x = xmlDoc.documentElement.childNodes;
    
        var ul = document.getElementById("u");
    
        for ( var i in x) {
            var li = document.createElement("li");
            li.innerHTML = x[i].childNodes[0].nodeValue;
            console.log(x[i].childNodes[0].nodeValue);
            ul.appendChild(li);
        }
    </script>
    </body>
    </html>
    
    • 엄청 기본적인 문제였네요.. 제대로 숙지 못한 것이 창피합니다 ㅠㅠ 감사합니다! 알 수 없는 사용자 2017.5.12 16:19

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)