본문 바로가기
Programming/HTML & CSS & JavaScript

js 5일차 - DOM(DOM, 객체분해할당)

by yoon9i 2024. 5. 9.

###########################################################################
###########################################################################
8장. DOM
###########################################################################

1. 개요
- Document Object Model
=> Document(html 문서)
   Object(JS객체)
=> 사용자가 만든 html(태그 및 속성)문서를 웹브라우저가 랜더링 하기 위해서
   html 내의 요소(태그 및 속성)에 해당되는 객체(HTMLButtonElemnet, HTMLAnchorElemnet)
   를 생성해서 메모리에 올리고(DOM Tree) 메모리에 올라간 객체를 참조해서 관리하는
   방법론.

   우리는 메모리에 올라간 JS객체(DOM)의 속성과 메서드를 이용해서
   동적인 화면처리가 가능하다.

- DOM 접근방법 (html 문서를 참조하는 Document 객체를 이용, 실제 참조는 document 변수를 이용)

    # 하나의 요소(객체)를 반환
    document.getElementById("아이디값");
    document.querySelector("css 선택자");

    # 여러개의 요소를 반환(배열)
    document.querySelectorAll("css 선택자");


2. DOM 의 값 종류
1> 시작태그와 종료태그의 content(body)
    ex>
        <p>홍길동</p>
        <p><span>홍길동</span></p>
        <div>홍길동</div>
        <div><span>홍길동</span></div>

- content 접근은 innerText / innerHTML 사용한다.

2> <input> 태그같은 폼의 태그의 값
- value 속성 사용한다.


3. 폼과 관련 내용 정리
1> 기본내용

    <form action="target.html" method="get|post" id="myForm">
        아이디: <input />

        <input type="submit" value="로그인">
        <button>로그인</button>

        <input type="button" value="로그인"> <== 눌러도 submit 이 안됨, JS 이용하면 가능함.
    </form>

- form 태그안에 감싸져있어야지 submit 이 가능하다.
- input 타입의 button 은 submit 이 불가능하다.


2> 동적으로 form 의 속성값을 변경할 수 있다.

    var f = document.querySelector("myForm"); // HTMLFormElement 객체
    f.action = "구글url";
    f.method = "get|post";

    f.submit();

3> submit 은 기본으로 동작됨. 기본동작을 방지할 수 있다.

    event.preventDefault();

 

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

<head>
    <title>js12_DOM처리01</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function get_message() {
            var p = document.querySelector("#x");
            // console.dir(p); // HTMLParagraphElement
            // console.log(p.innerHTML);
            // console.log(p.innerText);

            //-------------------------------

            var div = document.querySelector("#result");
            div.innerHTML = p.innerHTML;
        }

        function set_message() {
            var p = document.querySelector("#x");
            // p.innerText = "world";
            p.innerHTML = "<h1>world</h1>";
        }
    </script>
</head>

<body>
    <p id="x">
        <span>
            Hello
        </span>
    </p>

    <button onclick="get_message()">값 얻기</button>
    <button onclick="set_message()">값 수정</button>
    <div id="result"></div>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리02</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function get_message() {
            var input = document.querySelector("#username");
            console.dir(input); // HTMLInputElement
            console.log(input.value);

            var div = document.querySelector("#result");
            div.innerHTML = input.value;
        }

        function set_message() {

        }
    </script>
</head>

<body>
    입력값: <input type="text" name="username" id="username" value="이순신">
    <button onclick="get_message()">값 얻기</button>
    <div id="result"></div>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리03</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function count() {
            // var inpiut = document.querySelector("#message");
            // var message = input.value;

            var message = document.querySelector("#message").value;
            var cnt = message.length;

            // var div = document.querySelector("#result");
            // div.innerHTML = cnt;

            document.querySelector("#result").innerHTML = cnt;
        }
    </script>
</head>

<body>
    입력값: <input type="text" name="message" id="message" onkeyup="count()"><br>
    글자수: <div id="result"></div>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리04</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 방법1)
        function cal(op) {
            var v1 = document.querySelector("#v1").value;
            var v2 = document.querySelector("#v2").value;

            var result;
            switch (op) {
                case "+":
                    result = Number.parseInt(v1) + Number.parseInt(v2);
                    break;
                case "*":
                    result = Number.parseInt(v1) * Number.parseInt(v2);
                    break;
            }

            document.querySelector("#result").innerHTML = result;
        }

        // 방법2)
        function cal2() {
            var v1 = document.querySelector("#v1").value;
            var v2 = document.querySelector("#v2").value;

            // event.target 는 매우 중요함.
            // var op = event.target; <button>-</button> 로 나옴
            //                        content 를 가져올수 있음.
            var op = event.target.innerHTML;
            // console.log(op);
            var result;
            switch (op) {
                case "-":
                    result = Number.parseInt(v1) - Number.parseInt(v2);
                    break;
                case "/":
                    result = Number.parseInt(v1) / Number.parseInt(v2);
                    break;
            }

            document.querySelector("#result").innerHTML = result;
        }
    </script>
</head>

<body>
    입력값1: <input type="text" name="v1" id="v1"><br>
    입력값2: <input type="text" name="v2" id="v2"><br>
    <button onclick="cal('+')">+</button>
    <button onclick="cal('*')">*</button><br>

    <button onclick="cal2()">-</button>
    <button onclick="cal2()">/</button><br>

    결과값: <div id="result"></div>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리05</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function total() {
            var quantity = document.querySelector("#quantity").value;
            var price = document.querySelector("#price").value;
            var total = quantity * price;

            document.querySelector("#result").innerHTML = total;
        }
    </script>
</head>

<body>
    수량: <input type="text" name="quantity" id="quantity"><br>
    가격:
    <select name="price" id="price" onchange="total()">
        <option value="1000">1000</option>
        <option value="2000">2000</option>
        <option value="3000">3000</option>
    </select>

    <div id="result"></div>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리06</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function check() {
            // var addr1 = document.querySelector("#arrd1").value;
            // var addr2 = document.querySelector("#addr2").value;
            var checkbox = document.querySelector("#sameAddress");
            console.dir(checkbox.checked);

            if (checkbox.checked) {
                document.querySelector("#addr2").value
                    = document.querySelector("#addr1").value;
            } else {
                document.querySelector("#addr2").value = "";
            }

        } 
    </script>
</head>

<body>
    회원주소: <input type="text" name="addr1" id="addr1" value="부산시"><br>
    배송지가 회원주소와 같다면 체크하시오. <br>
    <input type="checkbox" name="sameAddress" id="sameAddress" onclick="check()"><br>
    배송지주소: <input type="text" name="addr2" id="addr2"><br>

</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리07</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        window.onload = init;
        function init() {
            var li_list = document.querySelectorAll("li");
            console.log(li_list);

            var sum = 0;
            li_list.forEach(function (v, idx) {
                // console.log(v.innerText, idx);
                sum += Number.parseInt(v.innerText);
            });

            document.querySelector("#result").innerText = sum;

            //----------------------------------------------------------

            // table 작업
            var td_list = document.querySelectorAll(".x");
            console.log(td_list);

            var sum2 = 0;
            td_list.forEach(function (v, idx) {
                console.log(v.innerText, idx);
                sum2 += Number.parseInt(v.innerText);
            });

            document.querySelector("#total").innerText = sum2;
        }
    </script>
</head>

<body>
    <h1>구매목록</h1>
    <ul>
        <li>2500</li>
        <li>3500</li>
    </ul>
    총합:
    <div id="result"></div>
    <br>
    <!-- --------------------------------- -->
    <table border="1">
        <tr>
            <th>상품명</th>
            <th>가격</th>
        </tr>
        <tr>
            <td>사과</td>
            <td class="x">2500</td>
        </tr>
        <tr>
            <td>배</td>
            <td class="x">3500</td>
        </tr>
        <tr>
            <td>총가격</td>
            <td id="total"></td>
        </tr>
    </table>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리08</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 전체선택 & 전체해제
        function allCheck() {
            var check = document.querySelector("#allCheck").checked;
            // console.log(check);

            var check_list = document.querySelectorAll(".check");
            check_list.forEach(function (v, idx) {
                // v : 개별적인 checkbox
                v.checked = check;
            });
        }
    </script>
</head>

<body>
    <table border="1">
        <tr>
            <th>
                선택
                <input type="checkbox" onclick="allCheck()" id="allCheck">
            </th>
            <th>상품명</th>
            <th>가격</th>
        </tr>
        <tr>
            <td><input type="checkbox" class="check"></td>
            <td>사과</td>
            <td>2500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="check"></td>
            <td>배</td>
            <td>3500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="check"></td>
            <td>바나나</td>
            <td>1500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="check"></td>
            <td>수박</td>
            <td>5500</td>
        </tr>
    </table>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리09</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 전체선택 & 전체해제
        function allCheck() {
            var check = document.querySelector("#allCheck").checked;
            // console.log(check);

            var check_list = document.querySelectorAll(".check");
            check_list.forEach(function (v, idx) {
                // v : 개별적인 checkbox
                v.checked = check;

            });

        }

        // check 된 물품 총합구하기
        function total() {
            // "input:checked" : input 태그의 checked
            var check_list = document.querySelectorAll("input:checked");
            // console.log(check_list);
            var sum = 0;
            check_list.forEach(function (v, idx) {
                // console.log(v["data-price"], idx);
                // data-price 접근은 dataset.price 형식으로 접근해서 사용한다.
                console.dir(v.dataset.price);
                sum += Number.parseInt(v.dataset.price);
            });

            document.querySelector("#result").innerHTML = sum;
        }


    </script>
</head>

<body>
    <table border="1">
        <tr>
            <th>
                선택
                <input type="checkbox" onclick="allCheck()" id="allCheck">
            </th>
            <th>상품명</th>
            <th>가격</th>
        </tr>
        <tr>
            <td><input type="checkbox" class="check" data-price="2500"></td>
            <td>사과</td>
            <td>2500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="check" data-price="3500"></td>
            <td>배</td>
            <td>3500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="check" data-price="1500"></td>
            <td>바나나</td>
            <td>1500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="check" data-price="5500"></td>
            <td>수박</td>
            <td>5500</td>
        </tr>
    </table>
    <button onclick="total()">총합구하기</button>
    <div id="result"></div>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리10</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function go() {
            var f = document.querySelector("#myForm");
            console.dir(f);
            f.action = "http://www.google.com";
            f.submit();
        }
    </script>
</head>

<body>
    <form action="target.html" id="myForm">
        아이디: <input type="text" id="username"><br>
        비번: <input type="text" id="passwd"><br>

        <input type="submit" value="로그인">
        <button>로그인</button>

        <!-- 눌러도 submit 이 안됨. 단, JS 를 이용하면 가능하다. -->
        <input type="button" value="로그인" onclick="go()">

    </form>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js12_DOM처리11</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 수정버튼 ==> 구글
        // 삭제버튼 ==> 다음
        function go() {
            var btn = event.target.value;
            // console.log(btn);

            var f = document.querySelector("#myForm");

            if (btn == '수정') {
                f.action = "http://www.google.com";
            } else {
                f.action = "http://www.daum.net";
            }
            f.submit();
        }


    </script>
</head>

<body>
    <form action="target.html" id="myForm">
        아이디: <input type="text" id="username"><br>
        비번: <input type="text" id="passwd"><br>
        <br>
        <!-- input 타입의 button 은 자동 submit 이 안된다. -->
        <input type="button" value="수정" onclick="go()">
        <input type="button" value="삭제" onclick="go()">

    </form>
</body>

</html>

 

 

4. 객체분해할당 (destructuring) (*)

가. 배열 객체 분해 할당

<!DOCTYPE html>
<html>

<head>
    <title>js13_객체분해할당1_배열</title>
    <script>

        // 객체분해 할당

        //1. 배열

        //가. 이전 방식
        var arr = [10, 20];
        var a = arr[0];
        var b = arr[1];


        //나. 객체분해 할당
        var [a, b] = [10, 20];
        console.log(a, b);

        var [a, b] = [10, 20, 30, 40];
        console.log(a, b);

        var [a, b, c, d] = [10, 20];
        console.log(a, b, c, d);

        var [a, b, ...c] = [10, 20, 30, 40];
        console.log(a, b, c);

        var [a, b, c = 1, d = 2] = [10, 20];
        console.log(a, b, c, d);

        var a, b;
        [a, b] = [100, 200];
        console.log(a, b);

        //
        var [, , c] = [10, 20, 30];
        console.log(c);

        //활용
        var n = 10;
        var m2 = 20;

        // 2개의 값을 바꾸시오
        [m, n] = [n, m];
        console.log(n, m)

    </script>
</head>

<body>


</body>

</html>



나. JSON 객체 분해 할당

<!DOCTYPE html>
<html>

<head>
    <title>js13_객체분해할당2_JSON</title>
    <script>

        // 객체분해 할당

        //2. JSON

        //가. 이전 방식
        var json = { age: 20, name: '홍길동' };
        var name = json.name;  // 연관배열 사용 가능 json["age"]
        var age = json.age;     // 연관배열 사용 가능 json["name"]
        console.log(name, age);


        //나. 객체분해 할당

        var { name, age } = { age: 20, name: '홍길동' };
        console.log(name, age);

        var { name, email } = { age: 20, name: '홍길동' };
        console.log(name, email); // 

        var { name, email = "inky" } = { age: 20, name: '홍길동' };
        console.log(name, email);

        //변수명 변경
        var { age: x, name: y } = { age: 20, name: '홍길동' };
        console.log(x, y);

        //일반변수를 객체분해할당시 사용방법은 전체를 ()로 감싸야 된다.
        var age, name;
        ({ age, name } = { age: 20, name: '홍길동' });
        console.log(name, age);



    </script>
</head>

<body>


</body>

</html>

 

<!DOCTYPE html>
<html>

<head>
    <title>js13_객체분해할당3_함수호출시파라미터로사용</title>
    <script>

        //1. 이전방식
        function fun(n) {
            console.log(n[0], n[1]);
        }
        //배열 객체 전달
        fun([10, 20]);

        //2. 객체분해할당 방식
        function fun([n, n2, n3 = 1]) {
            console.log(n, n2, n3);
        }
        //배열 객체 전달
        fun([10, 20]);

        ////////////////////////////

        //1. 이전 방식
        function fun(n) {
            console.log(n.age, n.name);
        }
        //json 객체 전달
        fun({ age: 20, name: '홍길동' });

        //2. 객체분해할당 방식
        function fun({ name, age }) {
            console.log(name, age);
        }
        //arrow 함수 
        var fun = ({ name, age }) => console.log(name, age);

        //json 객체 전달
        fun({ age: 20, name: '홍길동' });

        var { name, age } = { age: 20, name: '홍길동' };

    </script>
</head>

<body>


</body>

</html>