본문 바로가기
공부기록/JavaScript

3월 16일 (1) JavaScript - node 활용 제어

by project100 2023. 3. 16.

노드 관계를 통한 요소 제어

HTML 요소 간의 관계를 활용(계층)

노드(Node) = HTML 요소

 

부모요소 > 자식요소

부모요소에서 자식요소 찾기 : 요소.childNodes;

자식요소는 반드시 복수(배열)이다.

 

const subnodes = htmlnodes.childNodes; //부모입장에서 자식 노드 찾아가기
    console.log(subnodes);

 

자식요소에서 부모요소 찾기 : 요소.parentElement;

부모요소는 반드시 하나다.

 

const elem_b = document.querySelector("#bo");
    console.log(elem_b.parentElement); // 자식 입장에서 부모 노드 찾아가기
    elem_b.parentElement.style.backgroundColor="darkgray";

 

text는 우리가 사용하는 것이 아니라, 컴퓨터상에서 처리하는 빈 공간 부분(줄 바꿈 부분)을 말한다.

 

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
</head>

<body>
    <h1>제목 태그</h1>
    <p>본문입니다.</p>
    <div>
        <p>Lorem ipsum <span id="bo">dolor sit</span> amet</p>
    </div>
</body>
<script>
    const htmlnodes = document.querySelector("html");
    console.log(htmlnodes);
    const subnodes = htmlnodes.childNodes; //부모입장에서 자식 노드 찾아가기
    console.log(subnodes);
    const bodynode = subnodes[2]; // 기본적으로 배열로 되어 있음.
    console.log(bodynode); // if나 for문 안에서 콘솔로 찍어서 text인지 아닌지 확인해보기

    const elem_b = document.querySelector("#bo");
    console.log(elem_b.parentElement); // 자식 입장에서 부모 노드 찾아가기
    elem_b.parentElement.style.backgroundColor="darkgray"; //부모요소를 처리함 배경색을 바꿈

</script>

</html>

 

html 요소의 추가/삭제

1) 요소의 생성

 document.createElement("태그명");

내용(content)을 가진 요소를 생성할 경우, text node도 함께 생성

 const h3elem = document.createElement("h3")

 

document.creatTextNode("문자열");  글자가 들어갈 경우에만 사용된다. input이나 img는 사용하지 않음.

const tn = document.createTextNode(`추가요소 ${i}`);

 

2) 요소의 추가

부모요소.appendChild(생성요소);

h3elem.appendChild(tn);
d1.appendChild(h3elem);

 

3) 요소의 삭제

일반적인 요소 삭제

삭제할요소.remove();  삭제할 요소를 찾아주어야 한다.

 

계층구조로 요소 삭제

부모요소.removeChild(자식요소); 

d1.removeChild(d1.childNodes[i - 1]);
 
<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>요소의 추가 삭제</title>
    <style>
        #d1 {
            width: 200px;
            height: 150px;
            border: 1px solid;
            overflow: auto;
        }

        .st1 {
            /*생성시 적용할 스타일*/
            background-color: violet;
        }

        .st2 {
            /*변경시 적용할 스타일*/
            background-color: khaki;
            color: navy;
        }
    </style>
</head>

<body>
    <button>추가</button>
    <button>스타일변경</button>
    <button>삭제</button>
    <hr>
    <!--공간안에 주석을 넣으면 text 빈공간으로 인식하기 때문에 처리가 되지 않는다.-->
    <div id="d1"></div>

    <!--요소가 추가될 공간
        <h3 class="st1">추가요소1</h3>-->
</body>
<script>
    // 버튼 요소 연결
    // const btns = document.querySelectorAll("button"); 둘중에 하나 사용
    const btns = document.getElementsByTagName("button"); //배열로 처리
    // 공간 요소 연결
    const d1 = document.getElementById("d1");

    let i = 0; //추가될 요소의 번호(카운트)

    btns[0].onclick = () => { //추가 버튼
        i++; // 카운터 증가 
        //요소 생성 h3
        const h3elem = document.createElement("h3") //가로 안에 태그명 작성, div, p로도 생성가능
        //생성할 요소 내의 글자 생성(텍스트) text node 생성
        const tn = document.createTextNode(`추가요소 ${i}`); // 추가할 카운터 번호를 내용으로 넣겠다.

        h3elem.classList.add("st1"); //마지막 입력, 생성한 요소도 똑같은 요소처럼 사용할 수 있다.

        // 생성 순서는 상관없으나, 추가할 경우 텍스트 노드 추가 먼저
        h3elem.appendChild(tn); // 요소 안에 글자를 먼저 집어넣음
        d1.appendChild(h3elem); // 요소가 추가될 공간에 넣는다.
        console.log(d1);
        console.log(d1.childNodes);
    }


    //스타일 변경 버튼
    btns[1].onclick = () => {
        //추가된 요소들을 모두 가져오기(배열)
        const child_h3 = d1.childNodes;
        console.log(child_h3);

        // for (let idx = 0; idx < child_h3.length; idx++) {
        //     child_h3[idx].classList.replace("st1", "st2");
        // }

        for (let ch of child_h3) {
            ch.classList.replace("st1", "st2");
        }
    }

    // 마지막으로 추가된 요소 삭제
    btns[2].onclick = () => {
        if (i == 0) {
            alert("삭제할 요소가 없습니다.");
            return;
        }

        // let leng = d1.childNodes.length; // 배열의 갯수를 변수로 만들어서 구해도 된다.
        // d1.removeChild(d1.childNodes[leng-1]);


        console.log(i);
        //i = 추가요소를 카운터한 값
        d1.removeChild(d1.childNodes[i - 1]);
        i--; //삭제할 때 번호를 같이 없애주는 것
    }

</script>

</html>