mjeongriver
article thumbnail
Published 2023. 1. 4. 17:54
day60-js TIL/Javascript

* 실습 1 - 메뉴를 선택할 때마다 밑에 div가 메뉴 이름으로 나오고 애니메이션 추가해줌.

<!DOCTYPE html>
<html lang="en">
<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>Document</title>

    <style>
        .toggle li {
            display: inline-block;
            padding: 15px 20px 14px;
            width: 25%;
            text-align: center;
            border: 1px solid #333;
            cursor: pointer;
        }

        .toggle-menu {
            display: none;
        }

        .active {
            display: block;
            animation: fadeIn 1s ease-in-out;
            background-color: aquamarine;
        }

        /* 애니메이션 */
        @keyframes fadeIn {
            from {
                opacity: 0;
                background-color: aqua;
                margin-left: -100px;
            } to {
                opacity: 1;
                background-color: aquamarine;
                margin-left: 0;
            }
        }

    </style>

</head>
<body>

    <section>
        <ul class="toggle">
            <li data-id="#toggle1">메뉴1</li>
            <li data-id="#toggle2">메뉴2</li>
            <li data-id="#toggle3">메뉴3</li>
        </ul>

        <div>
            <div class="toggle-menu active" id="toggle1">
                토글메뉴1
            </div>
            <div class="toggle-menu" id="toggle2">
                토글메뉴2
            </div>
            <div class="toggle-menu" id="toggle3">
                토글메뉴3
            </div>
        </div>

    </section>

    <script>
        var toggle = document.querySelector(".toggle");
        toggle.onclick = function(){
            if(event.target.tagName != "LI") return;
            

            var trigger = event.target.dataset.id;
            var tag = document.querySelector(trigger); //id를 가지고 있는 태그
           
            //다른 태그는 active 삭제
            var menu = document.querySelectorAll(".toggle-menu");
            for(var i = 0; i < menu.length; i++){
                menu[i].classList.remove("active");
            }

            tag.classList.add("active"); //active 추가


        }
    </script>
    
</body>
</html>

1. DOM

- DOM은 문서 객체 모델이라 하며, document객체를 의미합니다.

- DOM은 요소(element)의 선택, 삭제 생성 등을 위해 사용합니다.

- DOM객체를 이용한 요소의 접근은 자바스크립트의 강력한 기능이며 반드시 외워야 하는 기능입니다.

 

1) form 객체

- form객체는 document 객체의 하위 객체 중 하나 입니다.

- form을 이용하면 form 유효성 검사 등을 할 수 있습니다.

- form객체는 document의 하위 객체이므로 유일하게 name속성으로 선택이 가능합니다

ex) document.폼명.요소명

 

* 예제(form 객체)

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

<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>Document</title>
</head>

<body>

    <form action="list.board" name="actionForm">
        <h3>가입창</h3>
        이름: <input type="text" name="name"><br>
        번호: <input type="text" name="phone" onblur="phoneFunc(event)"><br>
        분야:
        <input type="checkbox" name="check">CSS
        <input type="checkbox" name="check">JS
        <input type="checkbox" name="check">HTML

        <input type="submit" value="submit">
    </form>

    <script>
        /*
        1. form 태그는 document의 자식이라서 form의 name으로 접근이 가능합니다.
        2. input은 form의 자식이라서 document.폼명.태그name으로 접근이 가능합니다.
        */

        // console.log(document.actionForm);
        // console.log(document.actionForm.name);
        // console.log(document.actionForm.phone);

        var submit = document.actionForm.querySelector("input[type='submit']");
        submit.onclick = function () {

            event.preventDefault(); //서브밋의 고유 이벤트 제거

            if (document.actionForm.name.value.length <= 0) {
                alert("이름은 필수입니다");
                document.actionForm.name.focus(); //포커싱
                return; //함수 종료

            } else if (document.actionForm.phone.value.length != 11) {
                alert("핸드폰 번호는 - 없이 11글자로 입력하세요");
                document.actionForm.phone.value = "";
                document.actionForm.phone.focus();
                return;

            } else { //체크박스
                var check = document.actionForm.check;
                var cnt = 0;
                for (var i = 0; i < check.length; i++) {
                    if (check[i].checked) {
                        cnt++;
                    }
                }

                if (cnt == 0) {
                    alert("분야를 하나 이상 선택해주세요");
                    return;
                }
            }

            document.actionForm.submit(); //폼.submit 하면 제출 가능

            
        }

        //위에 onclick 괄호에 event라고 썼을 때 phoneFunc() 괄호에 e라고 넣고 밑에 변수에 e라고 작성해주면 됨
        //
        function phoneFunc(e) { 
             e.target.value = e.target.value.replaceAll("-", ""); //하이픈 들어가 있으면 제거해줌
            // e.target.value = e.target.value.replace(/[^0-9]/g, '').replace(/^(\d{2,3})(\d{3,4})(\d{4})$/, `$1-$2-$3`);
        }


        </script>

</body>

</html>

 

2) 정규 표현식

* 예제(정규표현식) - test() 메소드는 인수로 전달된 문자열에 특정 패턴과 일치하는 문자열이 있는지를 검색하고 다 작성 후에 엔터 누르면 list.board로 넘어가는 메서드 사용

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<body>

    <form action="list.board" name="joinForm">
        <h3>가입창</h3>
        아이디:<input type="text" name="id" placeholder="문자와 숫자" onkeypress="enter(event)"><br>
        비밀번호:<input type="password" name="pw" placeholder="숫자, 영문자, 특수문자 최소한개" onkeypress="enter(event)"><br>
        생략......

        <button type="button" onclick="joinCheck()">가입</button>
    </form>

    <script>
        function joinCheck() {

            // var regExp = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{4,8}$/;
            // if( !regExp.test("aaabbb1!") ) {
            //     console.log("정규표현식 만족하지 않음");
            // }

            var regExp1 = /^[A-Za-z0-9]{5,10}$/;
            var regExp2 = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{4,8}$/;
            
            var form = document.joinForm; //폼태그
           
            if( !regExp1.test( form.id.value ) ) {
                alert("영문자 숫자 5-10글자 사이입니다");
                form.id.focus();
                return;

            } else if( !regExp2.test(form.pw.value) ) {
                alert("영문자 숫자 특수문자 포함 4~8글자 입니다");
                form.pw.focus();
                return;

            } else {
                form.submit(); //폼을 전송..
            }


        }

        //UX 엔터키값 처리
        function enter(e) {
            if(e.keyCode == 13) { //keycode는 사용자가 누른 키보드 번호 enter == 13
                joinCheck();
            }
        }

    </script>

    
</body>
</html>

 

3) 날짜 객체

* 예제 - 날짜 객체(~String: 똑같은 날짜인데 보여주는 형식이 다름)

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

<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>Document</title>
</head>

<body>

    <script>
        var date = new Date(2023, 0, 4); //년월일 (월은 0부터)
        var date = new Date(2023, 1, 4, 14, 22, 0); //년월일시분초
        var date = new Date(); //현재 시간
        console.log(date);

        //똑같은 날짜인데 보여주는 형식이 다름(날짜의 포맷형식 변환 함수)
        console.log(date.toUTCString());
        console.log(date.toLocaleTimeString());
        console.log(date.toISOString());

        //년 월 일 을 얻는 getter
        var milis = date.getTime();
        console.log(milis); //1970.1.1~현재까지 지난 시간을 밀리초

        var year = date.getFullYear(); //년
        var month = date.getMonth() + 1; //월
        var day = date.getDate();

        var hour = date.getHours(); //시간
        var minute = date.getMinutes(); //분
        var seconds = date.getSeconds(); //초

        console.log(year + "년" + month + "월" + day + "일" + hour + ":" + minute + ":" + seconds);





    </script>

</body>

</html>

 

2. BOM

- BOM은 브라우저 객체 모델이라 하며, 내장객체들을 의미합니다.

- window, location. history, document 등이 포함됩니다.

- window 객체는 웹브라우저에 대한 전반적인 정보 취득이나 제어에 관련된 객체이며 하위 객체에는 location, history, document 등이 있습니다.

 

1) window 팝업

* 예제(window 팝업)

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<body>

    <script>
        window.onload = function(){
            // window.open("popup.html"); //open("띄울 창", "별칭", "옵션")
            window.open("popup.html", "별칭", "width=200px, height=300px, left=100px, top=100px, location=no");
        }
    </script>
    
</body>
</html>
<!DOCTYPE html>
<html lang="en">

<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>Document</title>
</head>

<body>
    팝업창

    <input type="checkbox" class="x">오늘 하루 이 창을 열지 않기

    <script>
        var x = document.querySelector(".x");
        x.onclick = function () {
            //쿠키
            window.close();

            //opener - 주창과 보조창 간의 데이터 전달이 가능합니다.
        }

    </script>
</body>

</html>

 

2) window 인터벌(주기적으로 실행)

* 예제(window 인터벌) - 버튼을 누르면 동작이 멈춤, setInterval, clearInterval

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<body>

    <button class = "stop">멈춰</button>

    <script>
        //일정 주기마다 동작
       var id = window.setInterval(function() {
            console.log('실행됨');
        }, 1000); //(실행시킬 함수, 인터벌); 1초마다 동작

        //인터벌 중지
        var stop = document.querySelector(".stop");
        stop.onclick = function(){
            window.clearInterval(id); //버튼을 누르면 중지 됩니다.
        }


    </script>
    
</body>
</html>

 

3) window 타임아웃

* 예제(window 타임아웃) - setTimeout: 경고창이 5초 뒤에 출력 됨

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<body>

    <button class = "stop">5초 뒤에 경고창이 나오는데 중지하려면 누르세요</button>

    <script>
        //5000은 5초 뒤에 실행 하겠다는 의미(경고창이 5초 뒤에 나옴)
        //window 생략 가능
        var id = setTimeout(function() {
            alert("5초 후 출력됨")
        }, 5000)

        var stop = document.querySelector(".stop");
        stop.onclick = function(){
            clearTimeout(id); //settimeout이 가지고 있는 고유 값을 넣어 줘야 함
        }
    </script>
    
</body>
</html>

 

* 실습 2 - interval로 이미지 변경하기

<!DOCTYPE html>
<html lang="en">
<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>Document</title>

    <!-- <style> //내 답안, 선생님 답안 1
        * {padding: 0; margin: 0;}
        .bgimg {
            animation: fadeIn 1s ease-in-out;
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
            } to {
                opacity: 1;
            }
        }

    </style> -->

    <style>
        .slideImg {display: none;}
        .slideImg.active {display: inline; animation: fadeIn 0.5s ease-in-out;}
        @keyframes fadeIn {
            from {
                opacity: 0;
            } to {
                opacity: 1;
            }
        }
    </style>

</head>
<body>

    <h3>애니메이션이 주기적으로 동작하려면 태그가 변경되야 합니다.</h3>
    <div class = "slide">
        <img src= "img/slide1.jpg" class ="slideImg active">
        <img src= "img/slide2.jpg" class ="slideImg">
        <img src= "img/slide3.jpg" class ="slideImg">
        <img src= "img/slide4.jpg" class ="slideImg">
    </div>

    <script>
        //내 답안
        //원래 div에 <img src= "img/slide1.jpg" class ="bgimg"> 한줄 있음
        // var bgImg = document.querySelector(".bgImg");
        // var slide = document.querySelector(".slide");
        // var count = 1;
        
        // var a = function(){
        //     slide.innerHTML = '<img src = img/slide' + count + '.jpg class = bgimg>';
        //     count++;
        //     if(count == 5) {
        //         count = 1;
        //     }
        // }
        // var id = setInterval(a, 2000);

        //선생님 답안 1
        // var num = 0;
        // var arr = ['img/slide1.jpg', 'img/slide2.jpg', 'img/slide3.jpg', 'img/slide4.jpg'];

        // setInterval(function() {
            
        //     var img = document.createElement("img"); //태그 생성
        //     img.src = arr[++num];
        //     img.classList.add("bgimg");

        //     //remove
        //     var slide = document.querySelector(".slide");
        //     slide.firstElementChild.remove(); //slide의 첫번째 자식 

        //     //append
        //     slide.appendChild(img);

        //     num++;
        //     if(num == arr.length-1) num = 0;

        // }, 1000);

        //선생님 답안 2
        var arr = document.querySelectorAll(".slide > .slideImg"); //배열
        console.log(arr);
        var i = 0;
        setInterval(function() {
            arr[i].classList.remove("active");
            i++;
            arr[i].classList.add("active");

            if(i == arr.length) {
                i = 0;
            }
        }, 1000);



    
    </script>

    
</body>
</html>

'TIL > Javascript' 카테고리의 다른 글

day62-js  (0) 2023.01.06
day61-js  (0) 2023.01.05
day59-js  (1) 2023.01.03
day58-js  (0) 2023.01.02
day57-js  (0) 2022.12.30
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그