[자바스크립트] children, appendChild 구현이 안됩니다ㅠㅠ 도와주세요

조회수 766회
//JavaScript
    <div id="target3">
    <ul>
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
    </ul>
    <input type="button" onclick="callReplaceChild()" value="replaceChild()"/>
    <script>
        function callReplaceChild(){
            var ol = document.createElement('ol');
            var target = document.getElementById('target3');
            var ul = document.querySelector('#target3>ul');
            console.log(ul);

            for(var i=0; i<ul.children.length;i++){
                console.log("li:",ul.children[i]);    
                ol.appendChild(ul.children[i]);
            }
            console.log("target: ",target.firstChild.nextSibling);
            target.replaceChild(ol, target.firstChild.nextSibling);
        }
    </script>
    </div>

ul태그를 ol태그로 변경하고 싶은데요, 중간에 for문에서 appendChild로 li 태그들을 ol태그의 자식으로 넣어주고 싶은데 실행하면 CSS를 제외한 값들만 들어갑니다. 코드상으로는 맞는것같고 ol.appendChild(ul.children[i])을 제외했을때 log에서 ul.children[i]는 전부 li태그를 잘 지정하는데.. 저걸 넣어서 실행만하면 2번째 li태그는 제외되는데 왜그럴까요ㅠㅠ brackets 오류인가요?? 고수님들 도와주세요ㅠㅠ

1 답변

  • 정확히는 "CSS"만 빠지는게 아니고, appendChild()의 특성에 의해서 특정 인덱스가 건너뛰어지는 겁니다.

    만약 주어진 노드가 이미 문서에 존재하는 노드를 참조하고 있다면 appendChild() 메소드는 노드를 현재 위치에서 새로운 위치로 이동시킵니다. (중략)이것은 한 노드가 문서상의 두 지점에 동시에 존재할 수 없다는 것을 의미합니다. 그래서 만약 노드가 이미 부모를 가지고 있다면 우선 삭제되고 새로운 위치로 이동합니다. 출처

    for (var i = 0; i < ul.children.length; i++) {
        ol.appendChild(ul.children[i]);
        console.log(ul.innerHTML); // <------------- 이 라인을 나중에 추가해서 한번 확인해 보세요. 왜 CSS만 빠졌는지 알수 있습니다.
    }
    

    찾아보니 전형적으로 다음과 같이 합니다.

    // 작동되는 것 확인함
    // 더이상 자식이 없을 때까지 첫째 애를 뽑아다가 다른 집 자식으로 보내버림
    while (ul.childNodes.length > 0) {
        ol.appendChild(ul.childNodes[0]);
    }
    

    PS. 지금처럼 <script> 태그가 다른 DOM 안에 있는 것은 매우 좋지 않은 방식입니다. 그 DOM이 문서에서 사라지면 그 스크립트도 사라져 버립니다. 꼭 그래야 할 이유가 없다면 DOM 조작을 실행하는 스크립트는 </body> 직전에 가는 것이 좋습니다.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)