코딩 노트

Javascript03 - 회원가입 검사 코드, 체크박스 본문

JavaScript

Javascript03 - 회원가입 검사 코드, 체크박스

newbyeol 2023. 9. 4. 12:03

.*와 .*? 의 의미는 다르다. ?는 0또는 1이라는 뜻/*는 0이상이라는 뜻

15.join.html <script>

  <!-- Javascript 작성 공간 -->
     <script>
        function checkMemberId() {
            var input = document.querySelector("[name=memberId]");
            var regex = /^[a-z0-9]{5,20}$/; //따옴표가 아닌 슬래시로 작성

            var isValid = regex.test(input.value); //test는 정규표현식 객체만 가질 수 있다.

            input.classList.remove("success", "fail", "fail2");
            if(isValid) {
                //아이디 중복검사 코드 및 성공 실패
                input.classList.add("success");
                return true; //누가 불러서 검사할 수 있으니까
            }
            else {
                input.classList.add("fail");
                return false;
            }
        }

        function checkMemberPw() {
            var input = document.querySelector("[name=memberPw]"); //태그에 접근할 수 있는 참조(열쇠, 리모콘) 획득
            var regex = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$])[A-Za-z0-9!@#$]{8,16}$/;

            var isValid = regex.test(input.value);

            input.classList.remove("success", "fail");
            input.classList.add(isValid ? "success" : "fail");

            return isValid; //누가 불러서 검사할 수 있으니까
        }

        function checkMemberPw2() {
            var input1 = document.querySelector("[name=memberPw]"); //비밀번호 입력창
            var input2 = document.querySelector("#password-check"); //비밀번호 입력 확인창

            input2.classList.remove("success", "fail", "fail2");
            if(input1.value.length == 0) { //비밀번호 미작성 시
                input2.classList.add("fail2");
                return false;
            }
            else if(input1.value == input2.value) { //비밀번호 일치(자바 스크립트는 문자열이어도 비교연산 사용)
                input2.classList.add("success");
            return true;
            }
            else { //비밀번호 불일치
                input2.classList.add("fail");
                return false;
            }
        }

        function checkMemberNickname() {
            var input = document.querySelector("[name=memberNickname]");
           
            // var regex = /^[가-힣0-9]{2,10}$/; //단어만 가능
            var regex = /^[ㄱ-ㅎㅏ-ㅣ가-힣0-9]{2,10}$/; //초성도 가능

            var isValid = regex.test(input.value);

            input.classList.remove("success", "fail", "fail2");
            if(isValid) {
                // +중복검사(추후)
                input.classList.add("success");
                return true;
            }
            else {
                input.classList.add("fail");
                return false;
            }
        }

        function checkMemberEmail() {
            var input = document.querySelector("[name=memberEmail]");
            var regex = /^(.*?)@(.*?)$/;

            //입력값이 아예 없거나, 있다면 조건에 맞을 때
            var isValid = input.value.length == 0 || regex.test(input.value);
            input.classList.remove("success", "fail");
            input.classList.add(isValid ? "success" : "fail");
            return isValid;
        }

        function checkMemberContact() {
            var input = document.querySelector("[name=memberContact]");
            var regex = /^010[1-9][0-9]{7}$/;

            //아예 입력하지 않았거나, 조건에 맞는 경우에 true
            var isValid = input.value.length == 0 || regex.test(input.value);

            input.classList.remove("success", "fail");
            input.classList.add(isValid ? "success" : "fail");
            return isValid;

        }
       
        function checkMemberBirth() {
            var input = document.querySelector("[name=memberBirth]");

            var regex = /^(19[0-9]{2}|20[0-9]{2})-(((0[13578]|1[02])-(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)-(0[1-9]|1[0-9]|2[0-9]|30))|((02)-(0[1-9]|1[0-9]|2[0-9])))$/;

            var isValid = input.value.length == 0 || regex.test(input.value);
            input.classList.remove("success", "fail");
            input.classList.add(isValid ? "success" : "fail");
            return isValid;
        }

        function checkMemberAddress() {
            var input1 = document.querySelector("[name=memberPost]");
            var input2 = document.querySelector("[name=memberAddr1]");
            var input3 = document.querySelector("[name=memberAddr2]");

            var isBlank = input1.value.length == 0 && input2.value.length == 0 && input3.value.length == 0;
            var isFill = input1.value.length > 0 && input2.value.length > 0 && input3.value.length > 0;

            //모두 비어있거나 모두 채워져 있을 때 true
            var isValid = isBlank || isFill;

            input1.classList.remove("success" , "fail");
            input2.classList.remove("success" , "fail");
            input3.classList.remove("success" , "fail");

            input1.classList.add(isValid ? "success" : "fail");
            input2.classList.add(isValid ? "success" : "fail");
            input3.classList.add(isValid ? "success" : "fail");

            return isValid;
        }

        function checkForm() {
            var result1 = checkMemberId();
            var result2 = checkMemberPw();
            var result3 = checkMemberPw2();
            var result4 = checkMemberNickname();
            var result5 = checkMemberEmail();
            var result6 = checkMemberBirth();
            var result7 = checkMemberContact();
            var result8 = checkMemberAddress();

            return result1 && result2 && result3 && result4 && result5 && result6 && result7 && result8;
        }

15.join.html <body>

<body>

        <form action="" method="post" autocomplete="off" onsubmit="return checkForm();">
           
            <div class="container w-600">

                <div class="row">
                    <h1>회원 정보 입력</h1>
                </div>

                <div class="row left">
                    <label>아이디</label>
                    <input type="text" name="memberId" placeholder="영문 소문자, 숫자 5~20자"
                    class="form-input w-100" onblur="checkMemberId();">
                    <div class="success-feedback">멋진 아이디입니다!</div>
                    <div class="fail-feedback">아이디를 형식에 맞게 입력하세요.</div>
                    <div class="fail2-feedback">이미 사용중인 아이디입니다.</div>
                </div>

                <div class="row left">
                    <label>비밀번호 <i class="fa-solid fa-asterisk red"></i></label>
                    <input type="password" name="memberPw"
                    placeholder="영문, 숫자, 특수문자 반드시 1개 이상 포함"
                    class="form-input w-100" onblur="checkMemberPw();">
                    <div class="success-feedback">올바른 비밀번호 형식입니다.</div>
                    <div class="fail-feedback">잘못된 비밀번호 형식입니다.</div>
                </div>

                <div class="row left">
                    <label>비밀번호 확인 <i class="fa-solid fa-asterisk red"></i></label>
                    <input type="password" id="password-check" placeholder="비밀번호 한 번 더 입력"
                    class="form-input w-100" onblur="checkMemberPw2();">
                    <div class="success-feedback">비밀번호가 일치합니다.</div>
                    <div class="fail-feedback">비밀번호가 일치하지 않습니다.</div>
                    <div class="fail2-feedback">비밀번호를 먼저 작성하세요.</div>
                </div>

                <div class="row left">
                    <label>닉네임</label> <i class="fa-solid fa-asterisk red"></i>
                    <input type="text"name="memberNickname" placeholder="한글 또는 숫자 2~10자"
                    class="form-input w-100" onblur="checkMemberNickname();">
                    <div class="success-feedback">멋진 닉네임이네요!</div>
                    <div class="fail-feedback">닉네임 형식이 올바르지 않습니다.</div>
                    <div class="fail2-feedback">닉네임이 이미 사용중입니다.</div>
                </div>

                <div class="row left">
                    <label>이메일</label>
                    <!-- 이메일 타입을 eamil로 하면 required를 쓴 것처럼 된다. -->
                    <input type = "text" name="memberEmail" placeholder="test@kh.com"
                    class="form-input w-100" onblur="checkMemberEmail();">
                    <div class="fail-feedback">이메일 형식이 잘못되었습니다.</div>
                </div>

                <div class="row left">
                    <label>전화번호</label>
                    <input type="tell" name="memberContact" placeholder="010XXXXXXXX (대시제외)"
                    class="form-input w-100" onblur="checkMemberContact();">
                    <div class="fail-feedback">전화번호 형식이 올바르지 않습니다.</div>
                </div>

                <div class="row left">
                    <label>생년월일</label>
                    <input type="date" name="memberBirth" class="form-input w-100"
                    onblur="checkMemberBirth();">
                    <div class="fail-feedback">잘못된 날짜를 선택하셨습니다.</div>
                </div>
               
                <div class="row left">
                    <label style="display: block;">주소</label>
                    <input type = "text" name="memberPost" placeholder="우편번호" class="form-input"
                    onblur="checkMemberAddress();" size="6" maxlength="6">
                    <button type="button" class="btn">
                        <i class="fa-solid fa-magnifying-glass"></i>
                    </button>
                    <input type="text" name="memberAddr1" placeholder="기본주소"
                    class="form-input w-100 mt-10" onblur="checkMemberAddress();">
                    <input type="text" name="memberAddr2" placeholder="상세주소"
                    class="form-input w-100 mt-10" onblur="checkMemberAddress();">
                    <div class="fail-feedback">모든 주소를 작성해주세요.</div>
                </div>

                <div class="row left">
                    <button type="submit" class="btn btn-positive w-100">가입하기</button>    
                </div>

            </div>

        </form>

</body>

16.object.html <script>

<!-- Javascript 작성 공간 -->
     <script>
        //자바스크립트 객체(Object)
        //- 기본적인 브라우저 통제를 위한 내장객체
        //- 내가 만들어 쓰는 사용자 객체

        function window01() {
            //console.log(window);
            //window.alert("알림창 출력 완료");
           
            //window 키워드는 생략 가능하다.
            alert("알림창 출력 완료");
        }

        function window02() {
            var choice = window.confirm('정말 이동하시겠습니까?');
            console.log(choice); //확인(true) / 취소(false)

            if(choice) {
                location.href = "https://www.google.com"; //강제이동
            }

        }

        function window03() {
            //사용하지 않는 기능
            window.prompt("아무거나 입력하세요");
            console.log(value);
        }

        function window04() {
            // window.open("주소");
            open("https://www.naver.com");
        }

        function window05() {
            //window.open("주소", "ID", "새창 옵션");
            //open("https://www.google.com", "_blank", "width=500, height=500"); //무한 새창
            //open("https://www.google.com", "win1", "width=500, height=500"); //하나만 열림

            //구글은 새창이 타겟팅되지 않음
            window.open("https://www.melon.com/", "win", "popup"); //하나만 열림
        }

        function location01() {
            //console.log(window.location);
            //console.log(location);
            location.href = "https://www.google.com";
        }

        function location02() {
            //ㄴconsole.log(window.location); //쓸 수 있는 지 없는 지 나온다.
            location.reload();
        }

        function history01() {
            //console.log(window.history); 명령들을 확인 가능
            history.back(); //history.go(-1);
        }

        function history02() {
            history.go(-2);
        }


        //document.querySelector()는 가장 위에 있는 1개의 태그를 선택
        //document.querySelectorAll()은 해당하는 모든 태그를 선택
        function document01() {
            // console.log(window.document);
            // var tag = document.querySelector("h1"); //원치 않는 결과
            // var tag = document.querySelector("#target");

            // var tag = document.querySelectorAll(".temp"); // 자바의 배열이다.
            // tag.style.color = "red"

            var tag = document.querySelectorAll(".temp");
            // tag[0].style.color = "red";

            for(var i = 0; i < tag.length; i++){
                tag[i].style.color = "red";
            }
        }

        //document.getElementById(아이디) - 가장 중요!
        //안 되는 브라우저가 없다는 것이 가장 좋은 점이지만 아이디가 있어야 한다는 것이 단점

        //document.getElementsByClassName(클래스)
        //document.getElementsByTagName(태그명)
        function document02() {
            var tag = document.getElementById("target"); //아이디는 유일하니까, 무조건 아이디니까 #을 쓰지 않음
            tag.style.color = "red";

            // var tag = document.getElementsByClassName("temp");
            // tag[0].style.color = "red"; //안 쓴다. 이거 쓸 바에 querySelector 사용
        }
     </script>

16.object.html <body>

<body>
    <div class="container w-600">
        <div class="row">
            <h1>자바스크립트 내장 객체</h1>
        </div>
        <div class="row left">
            자바스크립트 내장객체는 브라우저를 제어하는 것이 목표이며
            브라우저의 촤상위 요소가 창(window)이다.
            <br>
            창을 제어하는 내장객체의 이름은 window이다.
        </div>
        <div class="row">
            <button onclick="window01();">알림창</button>
            <button onclick="window02();">확인창</button>
            <button onclick="window03();">입력창</button>
            <button onclick="window04();">새탭</button>
            <button onclick="window05();">새창</button>
        </div>

        <div class="row left">
            location은 window의 하위 객체이며 주소창과 새로고침버튼 등의 정보 및 제어 기능이 존재
        </div>
        <div class="row">
            <button onclick="location01();">구글로 이동</button>
            <button onclick="location02();">새로고침</button>
        </div>

        <div class="row left">
            history는 window의 하위 객체이며
            방문이력을 관리하며 뒤로 혹은 앞으로 이동 기능이 존재
        </div>
        <div class="row">
            <button onclick="history01();">뒤로가기</button>
            <button onclick="history02();">뒤로 2페이지 가기</button>
        </div>

        <div class="row left">
            document는 window의 하위 객체이며
            문서를 제어할 수 있는 기능을 가지고 있다.
        </div>
        <div class="row">
            <button onclick="document01();">선택하기(신버전)</button>
            <button onclick="document02();">선택하기(구버전)</button>
        </div>

        <div class="row">
            <h1 id="target" class="temp">선택 대상</h1>
            <h1 id="target2" class="temp">선택 대상</h1>
           
        </div>

    </div>
</body>

  <script>
        //자바스크립트에서는 배열과 객체를 모두 객체라고 한다.
        //- 각각 2종류씩의 생성방법이 존재한다.
       
        //객체는 (1) 생성자 함수 (2) 일회용 객체 방식이 존재
        function Student(name, score) {
            this.name = name; //미래의 생성될 객체, 주인공
            this.score = score;
        }
        //(1)
        var a = new Student("피카츄", 50);
        var b = new Student("라이츄", 70);

        console.log(a);
        console.log(b);
     </script>

17.object2.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>자바스크립트 사용자 객체</title>

    <!-- 구글 웹 폰트를 사용을 위한 CDN -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    <!-- 아이콘 사용을 위한 Font Awesome 6 CDN -->
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
   
    <!-- 내가 만든 CSS 파일을 불러오는 코드 -->
    <link rel="stylesheet" type="text/css" href="./css/reset.css">
    <link rel="stylesheet" type="text/css" href="./css/commons.css">
    <link rel="stylesheet" type="text/css" href="./css/test.css">
    <style>
   
    </style>

     <!-- Javascript 작성 공간 -->
     <script>
        //자바스크립트에서는 배열과 객체를 모두 객체라고 한다.
        //- 각각 2종류씩의 생성방법이 존재한다.
       
        //객체는 (1) 생성자 함수 (2) 일회용 객체 방식이 존재
        function Student(name, score) {
            this.name = name; //미래의 생성될 객체, 주인공
            this.score = score;
        }

        //(1)
        var a = new Student("피카츄", 50);
        var b = new Student("라이츄", 70);

        console.log(a);
        console.log(a.name, a.score);
        console.log(b);
        console.log(b.name, b.score);

        //(2) -이 방식을 많이 씀-
        //자바의 map이랑 비슷
        var c = {
            name : "피카츄",
            age : 20
        };

        var d = {
            name : "라이츄",
            age : 25
        };
        console.log(c);
        console.log(d);

        //배열은 (1) 정적 (2) 동적 방식으로 생성할 수 있다.
        //- 생성과 메모리 저장방식이 다를 뿐 자바스크립트 배열은 모두 늘어난다.

        //(1) -많이 쓰고 성능도 빠름-
        var e = [10, 20, 30];
        // e[4] = "hello";
        e.push(40); //맨 뒤에 데이터를 추가
        console.log(e);

        //(2) -이 방식은 흔치 않음-
        var f = new Array(100);
        console.log(f);
        console.log(f.length);


     </script>
</head>
<body>

</body>
</html>

18.quiz.html (배열문제)

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Javascript 실습</title>

    <!-- 구글 웹 폰트를 사용을 위한 CDN -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    <!-- 아이콘 사용을 위한 Font Awesome 6 CDN -->
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
   
    <!-- 내가 만든 CSS 파일을 불러오는 코드 -->
    <link rel="stylesheet" type="text/css" href="./css/reset.css">
    <link rel="stylesheet" type="text/css" href="./css/commons.css">
    <link rel="stylesheet" type="text/css" href="./css/test.css">
    <style>
   
    </style>

     <!-- Javascript 작성 공간 -->
     <script>

        //다음 점수 데이터로 (1)총점, (2)평균, (3) 60점의 예상등수 구하여 출력
        var scoreList = [70, 55, 90, 100, 82, 88];

        var scoreTotal = 0;

        for (var i = 0; i < scoreList.length; i++) {
            scoreTotal += scoreList[i];
        }

        var scoreAvg = scoreTotal / scoreList.length;
        console.log("합계 = " + scoreTotal);
        console.log("평균 = " + scoreAvg);
        console.log("평균 = " + parseInt(scoreAvg));

        var rank = 1;
        for(var i = 0; i < scoreList.length; i++){
            if(scoreList[i] > 60) {
                rank ++;
            }
        }

        console.log("60점의 예상등수 = " + rank);

        //다음 배열에 1부터 100 사이에서 1의 자리에 3,6,9가 들어간 숫자를 추가
        var number369 = [];
        for(var i = 1; i < 100; i++){
            var ten = parseInt(i / 10) == 3 || parseInt(i / 10) == 6 || parseInt(i / 10) == 9;
            var one = i % 10 == 3 || i % 10 == 6 || i % 10 == 9;
            // if (1의 자리가 3, 6, 9라면){
                if (ten || one) {
                    number369.push(i);
            }
        }
        console.log(number369);
     </script>
</head>
<body>

</body>
</html>

19.checkbox.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Javascript 실습</title>

    <!-- 구글 웹 폰트를 사용을 위한 CDN -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    <!-- 아이콘 사용을 위한 Font Awesome 6 CDN -->
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
   
    <!-- 내가 만든 CSS 파일을 불러오는 코드 -->
    <link rel="stylesheet" type="text/css" href="./css/reset.css">
    <link rel="stylesheet" type="text/css" href="./css/commons.css">
    <link rel="stylesheet" type="text/css" href="./css/test.css">
    <style>
   
    </style>

     <!-- Javascript 작성 공간 -->
     <script>
        //속성명과 값이 같은 속성들은 자바스크립트에서 논리로 관리한다.
        //- (ex) checked, selected, required, disabled, readonly
        function testCheck() {
            var checkbox = document.querySelector("#test");
            // var checkbox = document.getElementById("test");

            // console.log(checkbox.checked);

            var button = document.querySelector("#button");
            // if(체크가 되었다면)
            // if(checkbox.checked){
            //    button.disabled = false; //버튼의 비활성화를 해제
            // }
            // else {
            //    button.disabled = true; //버튼의 비활성화를 설정
            // }
            button.disabled = !checkbox.checked; //버튼비활성화를 체크 반대로 설정
        }
     </script>
</head>
<body>
    <div class="container w-600">
        <div class="row">
            <h1>체크박스 제어</h1>
        </div>
        <div class="row left">
            <!-- 라벨로 체크박스를 감싸면 ID가 없어도 타겟팅이 가능 -->
            <label>
                <input id="test" type = "checkbox" oninput="testCheck();"> <!-- (나중) -->
                <!-- <input id="test" type="checkbox" onchange="testCheck();"> (기존) 선호-->
                체크박스
            </label>
        </div>

        <div class="row">
            <button id="button" disabled>버튼</button>
        </div>
    </div>
</body>
</html>

 

20.policy.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이용약관</title>

    <!-- css 파일을 불러오는 코드 -->

    <!-- 아이콘 사용을 위한 Font Awesome 6 CDN -->
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">

    <!-- 구글 웹 폰트 사용을 위한 CDN -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    <!-- 내가 만든 CSS 파일-->
    <link rel="stylesheet" type="text/css" href="./css/reset.css">
    <link rel="stylesheet" type="text/css" href="./css/commons.css">
    <link rel="stylesheet" type="text/css" href="./css/test.css">
    <style>

    </style>

    <!-- javascript 작성 공간 -->
    <script>
        function checkAgree1(){
            var agree1 = document.querySelector("#agree1");
            var agree2 = document.querySelector("#agree2");
            var agreeAll = document.querySelector("#agree-all");
            var nextBtn = document.querySelector("#next-btn");

            agreeAll.checked = agree1.checked && agree2.checked;
            nextBtn.disabled = !agreeAll.checked;
        }

        function checkAgree2(){
            var agree1 = document.querySelector("#agree1");
            var agree2 = document.querySelector("#agree2");
            var agreeAll = document.querySelector("#agree-all");
            var nextBtn = document.querySelector("#next-btn");

            agreeAll.checked = agree1.checked && agree2.checked;
            nextBtn.disabled = !agreeAll.checked;
        }

        function checkAgreeAll(){
            var agree1 = document.querySelector("#agree1");
            var agree2 = document.querySelector("#agree2");
            var agreeAll = document.querySelector("#agree-all");
            var nextBtn = document.querySelector("#next-btn");

            agree1.checked = agreeAll.checked;
            agree2.checked = agreeAll.checked;
            nextBtn.disabled = !agreeAll.checked;
        }
    </script>
</head>
<body>
    <div class="container w-600">
        <div class="row">
            <h1>이용약관</h1>
        </div>
        <div class="row left">
            <textarea class="form-input w-100" readonly>dummy text</textarea>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" id="agree1" oninput="checkAgree1();"> 동의합니다
            </label>
        </div>
        <div class="row left">
            <textarea class="form-input w-100" readonly>dummy text</textarea>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" id="agree2" oninput="checkAgree2();"> 동의합니다
            </label>
        </div>
        <hr>
        <div class="row left">
            <label>
                <input type="checkbox" id="agree-all" oninput="checkAgreeAll();"> 모두 동의합니다
            </label>
        </div>
        <div class="row">
            <button class="btn btn-positive w-100" disabled
                                            id="next-btn">다음 단계로 이동</button>
        </div>
    </div>
</body>
</html>

20-1.policy.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이용약관</title>

    <!-- css 파일을 불러오는 코드 -->

    <!-- 아이콘 사용을 위한 Font Awesome 6 CDN -->
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">

    <!-- 구글 웹 폰트 사용을 위한 CDN -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    <!-- 내가 만든 CSS 파일-->
    <link rel="stylesheet" type="text/css" href="./css/reset.css">
    <link rel="stylesheet" type="text/css" href="./css/commons.css">
    <link rel="stylesheet" type="text/css" href="./css/test.css">
    <style>

    </style>

    <!-- javascript 작성 공간 -->
    <script>
        function refreshCheckbox(tag) {
            //<계획>
            //1. 체크된 체크박스를 확인
            //2-1. 전체가 체크된 경우 개별항목을 모두 체크
            //2-2. 개별항목이 체크된경우 전체 체크여부를 확인

            //console.log(tag);
            //console.log(tag.classList);
            //console.log(tag.classList.contains("check-item"));

            if(tag.classList.contains("check-all")) {//2-1
                var itemList = document.querySelectorAll(".check-item");
                var allList = document.querySelectorAll(".check-all");

                //tag의 체크 상태에 따라 allList와 itemList를 모두 체크/해제
                for(var i=0; i < itemList.length; i++) {
                    itemList[i].checked = tag.checked;
                }
                for(var i=0; i < allList.length; i++) {
                    allList[i].checked = tag.checked;
                }

                //버튼 처리
                var btn = document.querySelector("#next-btn");
                btn.disabled = !tag.checked;
            }
            else if(tag.classList.contains("check-item")) {//2-2
                //개별항목이 모두 체크되어 있는지를 알아야 함
                //- itemList - 전체 체크박스 목록
                //- checkedItemList - 체크된 체크박스 목록
                var itemList = document.querySelectorAll(".check-item");
                var checkedItemList = document.querySelectorAll(".check-item:checked");
                var allChecked = itemList.length == checkedItemList.length;

                var allList = document.querySelectorAll(".check-all");
                for(var i=0; i < allList.length; i++) {
                    allList[i].checked = allChecked;
                }

                //버튼 처리
                var btn = document.querySelector("#next-btn");
                btn.disabled = !allChecked;
            }
        }
    </script>
</head>
<body>
    <div class="container w-600">
        <div class="row">
            <h1>이용약관</h1>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" class="check-all" oninput="refreshCheckbox(this)"> 모두 동의합니다
            </label>
        </div>

        <div class="row left">
            <textarea class="form-input w-100" readonly>dummy text</textarea>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" class="check-item" oninput="refreshCheckbox(this)"> 동의합니다
            </label>
        </div>
        <div class="row left">
            <textarea class="form-input w-100" readonly>dummy text</textarea>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" class="check-item" oninput="refreshCheckbox(this)"> 동의합니다
            </label>
        </div>
        <div class="row left">
            <textarea class="form-input w-100" readonly>dummy text</textarea>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" class="check-item" oninput="refreshCheckbox(this)"> 동의합니다
            </label>
        </div>
        <div class="row left">
            <textarea class="form-input w-100" readonly>dummy text</textarea>
        </div>
        <div class="row left">
            <label>
                <input type="checkbox" class="check-item" oninput="refreshCheckbox(this)"> 동의합니다
            </label>
        </div>
        <hr>
        <div class="row left">
            <label>
                <input type="checkbox" class="check-all" oninput="refreshCheckbox(this)"> 모두 동의합니다
            </label>
        </div>
       
        <div class="row">
            <button class="btn btn-positive w-100" disabled
                                            id="next-btn">다음 단계로 이동</button>
        </div>
    </div>
</body>
</html>