Front-end/Js

Js 기초(event)- AWS 풀스택 과정 24일차

awspspgh 2024. 8. 16. 18:13

오늘은 event에 대해서 배워보도록 하겠습니다.

 

목차
1. event
2. 예제 문제
3. 느낀 점

 

1. event

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>
        document에서 사용되는 이벤트를 정의
    </h1>
    <ul>
        <li>
            마우스 이벤트 : click(), focus(), input(), change(), mouseover(), mouseout(), scroll() ...
        </li>
        <li>
            키보드 이벤트 : keyDown(), keyPress(), keyUp()
        </li>
        <li>
            기타 이벤트 : preventDefault(), target, submit()
        </li>
        <li>
            addEventListener('eventName', callback Function);
            메서드를 사용하여 이벤트 구현을 권장
        </li>
        <li>
            이벤트 중복 부여 가능
        </li>
    </ul>
    <div id="container">
        <img src="../image/지친고양이.jpg" alt="" id="pic">
    </div>

    <script>
        // 이미지에 마우스를 올리면 그림을 변경
        // 마우스가 이미지 영역을 벗어나면 기존 그림으로 변경
        const pic = document.getElementById('pic');
        pic.addEventListener('mouseover', ()=>{
            pic.src="../image/따봉고양이.jpg";
        });
        pic.addEventListener('mouseout', ()=>{
            pic.src="../image/지친고양이.jpg";
        });
    </script>
</body>
</html>

 

▷ 출력

 

◈ move

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    <style>
        body{
            background-color: antiquewhite;
        }
        .icon{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
        }
        .icon>svg{
            color: brown;
            width: 100px;
            height: 100px;
        }
    </style>
</head>
<body>
    <div class="icon">
        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-cart-plus" viewBox="0 0 16 16">
            <path d="M9 5.5a.5.5 0 0 0-1 0V7H6.5a.5.5 0 0 0 0 1H8v1.5a.5.5 0 0 0 1 0V8h1.5a.5.5 0 0 0 0-1H9z"/>
            <path d="M.5 1a.5.5 0 0 0 0 1h1.11l.401 1.607 1.498 7.985A.5.5 0 0 0 4 12h1a2 2 0 1 0 0 4 2 2 0 0 0 0-4h7a2 2 0 1 0 0 4 2 2 0 0 0 0-4h1a.5.5 0 0 0 .491-.408l1.5-8A.5.5 0 0 0 14.5 3H2.89l-.405-1.621A.5.5 0 0 0 2 1zm3.915 10L3.102 4h10.796l-1.313 7zM6 14a1 1 0 1 1-2 0 1 1 0 0 1 2 0m7 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0"/>
          </svg>
    </div>
    <script>
        document.body.addEventListener('mousemove',(e)=>{
            console.log(e.pageX, e.pageY);
            document.querySelector('.icon').style.left = e.pageX+'px';
            document.querySelector('.icon').style.top = e.pageY+'px';
        });
    </script>
</body>
</html>

※ pageX, pageY

: 뒤에 'px'를 붙어야함

▷ 출력

 

◈ keyEvent

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>
        키보드 이벤트
    </h1>
    <ul>
        <li>
            keyDown : 키를 눌렀을 때
        </li>
        <li>
            keyPress : 키를 누르고 있는 시점
        </li>
        <li>
            keyUp : 키가 올라오는 순간
        </li>
    </ul>
    <h1>
        e.type : <span id="type1"></span>,
        e.key : <span id="key1"></span>,
        e.code : <span id="code1"></span>
    </h1>
    <h1>
        e.type : <span id="type2"></span>,
        e.key : <span id="key2"></span>,
        e.code : <span id="code2"></span>
    </h1>
    <h1>
        e.type : <span id="type3"></span>,
        e.key : <span id="key3"></span>,
        e.code : <span id="code3"></span>
    </h1>
    입력값 : <input type="text" id="str">
    <script>
        const type1 = document.getElementById('type1');
        const key1 = document.getElementById('key1');
        const code1 = document.getElementById('code1');
        const type2 = document.getElementById('type2');
        const key2 = document.getElementById('key2');
        const code2 = document.getElementById('code2');
        const type3 = document.getElementById('type3');
        const key3 = document.getElementById('key3');
        const code3 = document.getElementById('code3');

        document.getElementById('str').addEventListener('keydown', (e)=>{
            type1.innerText = e.type;
            key1.innerText = e.key;
            code1.innerText = e.code;
        });
        document.getElementById('str').addEventListener('keypress', (e)=>{
            type2.innerText = e.type;
            key2.innerText = e.key;
            code2.innerText = e.code;
        });
        document.getElementById('str').addEventListener('keyup', (e)=>{
            type3.innerText = e.type;
            key3.innerText = e.key;
            code3.innerText = e.code;
        });
    </script>
</body>
</html>

 

▷ 출력

 

◈ element

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button type="button" id="makeBtn">element</button>
    <div id="zone"></div>

    <script>
        document.getElementById('makeBtn').addEventListener('click',()=>{
            let newBtn = `<button type ="button" id="newBtn" onclick="make()">newBtn</button>`;
            document.getElementById('zone').innerHTML = newBtn;
            // 이 위치에서는 가능
            // document.getElementById('newBtn').addEventListener('click', ()=>{})
        });
        
        // 현 위치에서 newBtn이 생성되어 있는 상태가 아님. 인지 불가
        /*
        document.getElementById('newBtn').addEventListener('click', ()=>{
            console.log(111);
        });
        */

        // 문서 전체에 리스너를 장착하여 엘리먼트 선택한 후 id 검사
        /*
        document.addEventListener('click', (e)=>{
            if(e.target.id == 'newBtn'){
                document.getElementById('zone').innerHTML +=
                `<h3>생성된 버튼을 클릭<h3>`;
            }
        });
        */

        // 생성된 엘리머트에 onclick 가능
        function make(){
            document.getElementById('zone').innerHTML +=
                `<h3>생성된 버튼을 클릭<h3>`;
        }

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

 

▷ 출력

 

2. 예제 문제

◎ 문제

▶ 1번

비밀번호 조건: 문자, 숫자, 특수문자 각각 1개씩 8자이상

 

▶ 2번

오류 출력

 

출력 과정

 

정답

 

◎ 정답

▶ 1번

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            background-color: beige;
        }
        .container{
            width: 300px;
            background-color: bisque;
            /* 화면 정중앙 배치 */
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            text-align: center;
            border-radius: 10px;
            padding: 20px 30px;
        }
        .container .text-field, .btn{
            width: 100%;
            padding: 10px;
            box-sizing: border-box;
            margin-bottom: 10px;
            border: none;
            outline: none;
            border-radius: 5px;
            font-size: 15px;
        }
        .container .btn{
            /* background-color: rgb(245, 173, 86); */
            background-color: rgb(242, 197, 143);
            color: rgb(255, 255, 255);
            font-weight: 700;
            cursor: pointer;
        }
        .container .link{
            margin-top: 30px;
        }
        .container .link>a{
            color: rgb(141, 141, 141);
            text-decoration: none;
            font-size: 13px;
        }
    </style>
</head>
<body>
    <div class="container">
        <form action="">
            <input type="text" class="text-field" name="id" placeholder="아이디 8자이상">
            <input type="password" class="text-field" name="pw" placeholder="비밀번호">
            <input type="submit" class="btn" value="login" disabled>
        </form>
        <div class="link">
            <a href="">비밀번호를 잊어버리셨나요</a>
        </div>
    </div>
    

    <script>
        //id규칙 8자 이상
        //pw규칙 숫자, 문자, 특수문자 포함 8자이상
        //^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*].{8,}$
        const input = document.querySelectorAll('.text-field');
        const btn = document.querySelector('.btn');
        console.log(input);
        console.log(btn);
        input[0].addEventListener('input',()=>{
            console.log("1111")
             //id규칙 8자 이상
             let pwVaild = passwordValid();
             if(input[0].value.length > 7 && pwVaild){
                btn.style.setProperty('background-color', 'rgb(245, 173, 86)');
                btn.disabled = false;
             }else{
                btn.style.setProperty('background-color', ' rgb(242, 197, 143)');
                btn.disabled = true;
             }
        });

        function passwordValid(){
            let reg = new RegExp(/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*].{7,}$/);
            console.log(input[1].value, reg.test(input[1].value));
            if(reg.test(input[1].value)){
                return true;
            }
            return false;

        }
        input[1].addEventListener('input', ()=>{
            let pwVaild = passwordValid();
            if(input[0].value.length > 7 && pwVaild){
                btn.style.setProperty('background-color', 'rgb(245, 173, 86)');
                btn.disabled = false;
             }else{
                btn.style.setProperty('background-color', ' rgb(242, 197, 143)');
                btn.disabled = true;
             }
        });
    </script>
</body>
</html>

 

▶ 2번

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button type="button" id="startBtn">게임시작</button>
    <h1 id="comMsg"></h1>
    숫자입력 : <input type="text" id="myNum">
    <button type="button" id="tryBtn">게임확인</button>
    <ol id="ol"></ol>

    <script>
        const comSet = new Set();
        let comNums = [];
        const comMsg = document.getElementById('comMsg');
        const ol = document.getElementById('ol');

        document.getElementById('startBtn').addEventListener('click', makeGame);
        document.getElementById('tryBtn').addEventListener('click', compareNum);

        //비교
        function compareNum(){
            console.log(comNums);
            if(comSet.size<=0){
                comMsg.innerText = "게임시작버튼을 클릭해주세요.";
                return; //함수종료
            }
            let myNum = document.getElementById('myNum');
            //유효성 검증
            if(validMyNum(myNum.value)){
                console.log("검증통과!!");
                //비교
                let myNumsArr = myNum.value.split("");
                console.log(myNumsArr);

                let strike = 0, ball =0;

                //com
                for(let i=0; i<comNums.length; i++){
                    //my
                    for(let j=0; j<myNumsArr.length; j++){
                        if(comNums[i] == myNumsArr[j]){
                            if(i==j){
                                strike++;
                            }else{
                                ball++;
                            }
                            break;
                        }
                    }
                }

                if(strike == 0 && ball==0){
                    ol.innerHTML += `<li>${myNumsArr} => OUT!!</li>`;
                }else{
                    if(strike == 3){
                        ol.innerHTML += `<li>${myNumsArr} => SUCCESS!!</li>`;
                    }else{
                        ol.innerHTML += `<li>${myNumsArr} => ${strike}Strike, ${ball}Ball</li>`;
                    }
                }

            }else{
                console.log("검증실패!!");  
                comMsg.innerText="유효하지 않은 숫자입니다.";
            }
            myNum.value="";
            myNum.focus();
        }

        function makeGame(){
            //기존 값 초기화
            comNums = [];
            comSet.clear();
            ol.innerText='';
            while(comSet.size < 3){
                let rNum = Math.floor(Math.random()*10);
                comSet.add(rNum);
            }
            console.log(comSet);
            //set => arr 저장
            comSet.forEach((e)=>{
                comNums.push(e);
            });
            comMsg.innerText = "컴퓨터가 숫자를 결정하였습니다."
        }

        //검증
        //숫자는 3자리, 숫자만 가능, 비어있으면 안됨, 중복 안됨
        function validMyNum(myNum){
            if(myNum==''){
                return false;
            }else if(myNum.length != 3){
                return false;
            }else if(isNaN(myNum)){
                return false;
            }else if(new Set(myNum.split("")).size != 3){
                return false;
            }else{
                return true;
            }
        }
        // console.log(validMyNum('q'));
    </script>
</body>
</html>

 

3. 느낀 점

다음 주동안 화면 프로젝트를 시작하게 되기에 열심히 문제 위주로 복습하며 어떤 컨셉의 화면을 만들지 고민을 해봐야겠다. 특히 API에 관한 내용에 대해서 공부를 해봐야겠다.