본문 바로가기
뒷북 정리 (국비 교육)/javascript

[javascript] step06. createElement

by 규글 2021. 12. 11.

step06. - 01~02. createElement

    <h1>문서 객체를 javascript로 만들기</h1>
    <button id="addBtn">추가하기</button>
    <div id="one">

    </div>
    <script>
        /*
            추가하기 버튼을 눌렀을 때
            <p>안녕하세요</p> 형식의 요소를 동적으로 만들어서
            id가 one인 div에 추가되도록 해보세요.
        */
        document.querySelector("#addBtn").addEventListener("click", function(){
            let p = document.createElement("p");
            p.innerText = "안녕하세요";
            document.querySelector("#one").append(p);
        })

        // 속성 추가
        let img = document.createElement("img");
        img.setAttribute("src", "images/kim1.png")
    </script>
  1. createElement : 원하는 시점에, 원하는 객체를 만들어서 넣을 때 사용한다. console 창에서 직접 작성해보면 <div> 요소 안에 없던 <p> 요소가 생긴다. 이렇게 문서 객체를 동적으로 만들 때 사용한다. 하지만 변수에 넣어주지 않으면 그저 버려질 뿐이라고 했다.
  2. createElement로 만들어진 요소는 원하는 객체에 .append(xxx)를 통해서 추가할 수 있다.
    querySelector는 document의 기능이고, append나 addEventListener는 참조해온 것에 해당하는 객체의 기능이다.

 

    <style>
        .box{
            width: 100px;
            height: 100px;
            background-color: yellow;
            border: 1px solid red;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <button id="addBtn">추가</button>
    <div id="wrapper">
        <div class="box">box</div>
        <div class="box">box</div>
        <div class="box">box</div>
    </div>
    <script>
        document.querySelector("#addBtn").addEventListener("click", function(){
            const newDiv = document.createElement("div");
            newDiv.innerText="box";
            // class="box" 속성 추가하기
            newDiv.setAttribute("class", "box");
            // 새로 만든 div에도 eventlistener function 등록
            newDiv.addEventListener("click", function(){
                this.remove();
            });
            document.querySelector("#wrapper").append(newDiv);
        });
        // class attribute의 value가 box인 element의 reference value를 모두 찾아서
        // array에 담아오기
        const divs = document.querySelectorAll(".box");
        //divs.append(newDiv);
        for(i=0; i<divs.length; i++){
            divs[i].addEventListener("click", function(){
                console.log("clicked!");
                // click event가 일어난 바로 그(this) element를 삭제
                this.remove();
            });
        
        }
    </script>
  1. setAttribute("a", "b") : 만든 요소에 속성을 추가하는 함수.  value가 "b"인 "a" 속성을 추가한다.
  2. remove(  ) : 해당 참조값에 해당하는 요소를 제거한다.
  3. element.속성이름 = value; 의 작성도 가능하다.
    (ex - element.innerText="test";)
  4. cursor: pointer; : 손가락 모양의 커서를 만드는 css이다.

 

 

step06 - example

    <input type="text" id="inputName" placeholder = "이름 입력...">
    <input type="text" id="inputAddr" placeholder = "주소 입력..."><br>
    <button id="saveBtn">array에 저장하기</button>
    <button id="showBtn">저장된 내용을 table에 출력하기</button>
    <h1>회원 목록입니다</h1>
    <table border="1">
        <thead>
            <tr>
                <th>번호</th>
                <th>이름</th>
                <th>주소</th>
            </tr>
        </thead>
        <tbody id="tbid">
        
        </tbody>
    </table>
    <script>
        let ids = [];
        let addrs = [];
        let numbers =[];
        document.querySelector("#saveBtn").addEventListener("click", function(){
            obj = {};
            id = document.querySelector("#inputName").value;
            addr = document.querySelector("#inputAddr").value;
            obj.id = id;
            obj.addr = addr;
            obj.number = "";
            ids.push(obj);
            for(let i=0; i<ids.length; i++){
                number = i+1;
                ids[i].number = i+1;
            }          
        })
        document.querySelector("#showBtn").addEventListener("click", function(){
            let tr=document.createElement("tr");
            for(let i=0; i<ids.length; i++){
                let tr=document.createElement("tr");
                let td1=document.createElement("td");
                let td2=document.createElement("td");
                let td3=document.createElement("td");
                td1.innerText = ids[i].number;
                td2.innerText = ids[i].id;
                td3.innerText = ids[i].addr;
                tr.append(td1);
                tr.append(td2);
                tr.append(td3);
                let tbody=document.querySelector("#tbid");
                tbody.append(tr);
            }   
        })

다음은 같은 내용을 선생님께서 작성한 것이다.

        /* 선생님
        // 페이지 loading시에 빈 array를 미리 준비하기
        const members=[];
        let num=0;
        // 버튼에 이벤트 리스너 함수 등록하기
        document.querySelector("#saveBtn").addEventListener("click", function(){
            // 1. 입력한 이름을 읽어온다.
            const name = document.querySelector("#inputName").value;
            // 2. 입력한 주소를 읽어온다.
            const addr = document.querySelector("#inputAddr").value;
            // 3. 읽어온 한 명의 회원정보를 object에 저장한다.
            // 번호 증가시키키
            num++;
            obj = {name:name, address:address, number:num}
            // 4. object의 참조값을 array에 저장한다.
            members.push(obj);
        })
        document.querySelector("#saveBtn").addEventListener("click", function(){
            // 내용초기화
            // document.querySelector("#tbody").innerText="";
            // 반복문 돌면서
            //for(let i=0; i<members.length; i++){
            for(let i in members){
                let tmp.members[i];
                // object에 있는 정보를 이용해서 td 3개를 만들어서
                const td1=document.createElement("td");
                const td2=document.createElement("td");
                const td3=document.createElement("td");
                
                // 위에서 만든 td의 innerText 넣어주기
                td1.innerText=tmp.num;
                td2.innerText=tmp.name;
                td3.innerText=tmp["addr"];

                // tr 요소를 만들어서
                const tr = document.createElement("tr");
                // tr 요소에 추가하고
                tr.append(td1);
                tr.append(td2);
                tr.append(td3);
                // tr을 tbody에 추가
                document.querySelector("#tbody").append(tr);
            }
        }) 
        */

for loop문을 쓰는 또 다른 방법이 있다.

for(let i in members){
    tmp.num
    tmp.name
  	...
}

이와 같이 받아서, tmp(꼭 이것이 아니어도 됨) 로 받아서 해당 data를 사용할 수 있다. 이때는 members 배열의 길이만큼 배열에 대한 loop를 돌면서 각 차수에 대한 data 자체를 tmp로 받아버린 것이다.

 

 

step06 - quiz

    <button id="makeBtn">만들기</button>
    <div id="wrapper">
        <h1>정보를 입력하세요</h1>
        <input type="text" id="info" placeholder="입력...">
        <button id="addBtn">추가</button>
        <br>
        <img src="images/kim1.png" alt="김구라 이미지">
        <br>
        <ul class="my-class">
            <li>하나</li>
            <li>둘</li>
            <li>셋</li>
        </ul>
    </div>
    <script>
        document.querySelector("#makeBtn").addEventListener("click", function(){
            div = document.querySelector("#wrapper");
            h1 = document.createElement("h1");
            h1.innerText="정보를 입력하세요.";
            //div.append(h1);

            input = document.createElement("input");         
            input.setAttribute("id", "info");
            input.setAttribute("placeholder", "입력...");
            //div.append(input);

            btn = document.createElement("button");
            btn.setAttribute("id", "addBtn");
            btn.innerText = "추가"
            //div.append(btn);

            br1 = document.createElement("br");
            //div.append(br1);

            img = document.createElement("img");
            img.setAttribute("src", "images/kim1.png");
            img.setAttribute("alt", "김구라 이미지");
            //div.append(img);

            //br = document.createElement("br");
            br2 = document.createElement("br");
            //div.append(br2);

            ul = document.createElement("ul");
            ul.setAttribute("class", "my-class");
            li1 = document.createElement("li");
            li2 = document.createElement("li");
            li3 = document.createElement("li");
            li1.innerText="하나";
            li2.innerText="둘";
            li3.innerText="셋";
            ul.append(li1, li2, li3);

            //ul.append(li2);
            //ul.append(li3);
            //div.append(ul);
            div.append(h1, input,btn, br1, img, br2, ul);
        });
    </script>

댓글