codeStates front-end/Java Script

[JS] chapter12. 유효성 검사/ <실습> 회원가입 구현 / classList error

환테크 2023. 1. 6. 11:46
반응형

 

 

 

 

 

 

 

 

 

 

유효성 검사

 

 

  • 특정 값은 반드시 입력해야 합니다. (아이디, 이메일, 비밀번호, 이름, 전화번호 등)
  • 비밀번호는 n 자릿수 이상이어야 하고, 숫자나 특수문자를 반드시 포함해야 합니다.
  • 비밀번호와 비밀번호 확인란에 입력된 문자가 동일해야 합니다.
  • 신용카드의 경우, 입력한 신용카드의 번호가 유효해야 합니다.

 

이러한 것들을 유효성 검사라고 한다.

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

<실습> 유효성 검사를 통한 회원가입 구현 해보기

 

 

 

  • 추가적으로 비밀번호 입력 UI를 HTML을 이용해 만드세요.
  • 비밀번호 일치 여부를 검사하는 함수를 자바스크립트로 작성하세요.
    • 함수 isMatch 는 문자열 두 개를 입력으로 받고, boolean 타입을 리턴합니다.
  • 비밀번호 일치 여부에 따른 시각적 피드백을 제공하세요.
  • 모든 테스트를 통과하세요.
  • 모든 테스트를 통과한 후에는 CSS로 회원가입 페이지를 디자인 해보세요.

 

 

 

index.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>유효성 검사</title>
    <link rel="stylesheet" href="global-style.css" />
    <link rel="stylesheet" href="style.css" />
    <link
      href="//spoqa.github.io/spoqa-han-sans/css/SpoqaHanSansNeo.css"
      rel="stylesheet"
      type="text/css"
    />
    <script src="validator.js"></script>
  </head>

  <body>
    <main>
      <img
        class="logo"
        src="./images/fb-logo.png"
        alt="CODE_STATES_LOGO"
      />

      <fieldset>
        <input type="text" id="username" placeholder="아이디" />
      </fieldset>

      <div class="success-message hide">사용할 수 있는 아이디입니다</div>
      <div class="failure-message hide">아이디는 네 글자 이상이어야 합니다</div>

      <fieldset>
        <input type="password" id="password" placeholder="비밀번호" />
      </fieldset>

      <fieldset>
        <input
          type="password"
          id="password-retype"
          placeholder="비밀번호 확인"
        />
      </fieldset>

      <div class="mismatch-message hide">비밀번호가 일치하지 않습니다</div>
      <div class="clear-message hide">비밀번호가 일치합니다</div>

      <fieldset class="signup">
        <button>회원가입</button>
      </fieldset>
      <script src="script.js"></script>
    </main>
  </body>
  
</html>

 

 

 

style.css

 

 

* {
  box-sizing: border-box;
  padding: 0;
  margin: 0;
  font-family: 'Spoqa Han Sans Neo', 'sans-serif';
  color: var(--gray-900);
  background-color: var(--white);
  font-size: 16px;
}

body {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
  background-image: linear-gradient(
      to bottom,
      rgba(53, 112, 239, 0.3),
      rgba(255, 255, 255, 0)
    ),
    url('./images/lazy.gif');
}

main {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 24px;
  box-shadow: var(--big-box);
  border: 1px solid var(--gray-10);
  border-radius: 4px;
}

h1 {
  text-align: center;
  font-size: 36px;
}

fieldset {
  display: flex;
  flex-direction: column;
  border-radius: 4px;
  border-color: var(--gray-10);
  justify-content: center;
  margin: 4px;
  padding: 8px 12px;
}

fieldset > label {
  display: inline-block;
  width: 112px;
}

main > div {
  color: var(--peach-600);
  font-size: 12px;
  padding-left: 20px;
}

.logo {
  margin: 12px auto 36px;
  width: 144px;
}

button {
  cursor: pointer;
  border: none;
  border-radius: 4px;
  width: 12rem;
  height: 2.25rem;
  color: var(--white);
  background-color: var(--coz-blue-700);
  font-size: 14px;
  transition: all 0.3s;
}

button:hover {
  background-color: var(--coz-blue-500);
}

input {
  border: none;
  width: 12rem;
  font-size: 14px;
}

input:focus {
  outline: none;
}

.hide {
  display: none;
}

.signup {
  border: none;
}

 

 

 

global-style.css

 

 

 

:root {
  /* color */
  --bluish-gray-10: #f5f7f9;
  --bluish-gray-50: #f2f4f7;
  --bluish-gray-100: #eceef3;
  --bluish-gray-200: #dfe3ec;
  --bluish-gray-300: #ccd3e0;
  --bluish-gray-400: #b2bdd1;
  --bluish-gray-500: #8c9cba;
  --bluish-gray-600: #667ba3;
  --bluish-gray-700: #455573;
  --bluish-gray-800: #262f40;
  --bluish-gray-900: #0f1319;
  --white: #ffffff;
  --gray-10: #f7f7f7;
  --gray-50: #f2f2f2;
  --gray-100: #f0f0f0;
  --gray-200: #e6e6e6;
  --gray-300: #d6d6d6;
  --gray-400: #c2c2c2;
  --gray-500: #a3a3a3;
  --gray-600: #858585;
  --gray-700: #5c5c5c;
  --gray-800: #333333;
  --gray-900: #141414;
  --black: #000000;
  --coz-purple-10: #f3f2fd;
  --coz-purple-50: #efedfc;
  --coz-purple-100: #e8e5fb;
  --coz-purple-200: #d8d3f8;
  --coz-purple-300: #c0b9f4;
  --coz-purple-400: #a296ee;
  --coz-purple-500: #7361e5;
  --coz-purple-600: #452cdd;
  --coz-purple-700: #2c1a9e;
  --coz-purple-800: #190e58;
  --coz-purple-900: #0a0623;
  --coz-blue-10: #f2f5fd;
  --coz-blue-50: #edf1fc;
  --coz-blue-100: #e4ebfb;
  --coz-blue-200: #d2ddf9;
  --coz-blue-300: #b8c9f5;
  --coz-blue-400: #94adf0;
  --coz-blue-500: #5e85e8;
  --coz-blue-600: #295ce0;
  --coz-blue-700: #173ea1;
  --coz-blue-800: #0d2259;
  --coz-blue-900: #050e24;
  --coz-orange-50: #fff2e9;
  --coz-orange-100: #ffebde;
  --coz-orange-200: #ffe1cc;
  --coz-orange-300: #ffcead;
  --coz-orange-400: #ffb685;
  --coz-orange-500: #ff9247;
  --coz-orange-600: #ff6e0a;
  --coz-orange-700: #b84b00;
  --mint-50: #ebfff7;
  --mint-100: #e0fff2;
  --mint-200: #ccffea;
  --mint-300: #adffdd;
  --mint-400: #84ffcb;
  --mint-500: #47ffb2;
  --mint-600: #0aff98;
  --mint-700: #00b86a;
  --mint-800: #00663b;
  --peach-50: #ffeeeb;
  --peach-100: #ffe6e0;
  --peach-200: #ffd5cc;
  --peach-300: #ffbcad;
  --peach-400: #ff9b85;
  --peach-500: #ff6947;
  --peach-600: #ff360a;
  --peach-700: #b82100;
  --blackalpha-10: #00000008;
  --blackalpha-50: #0000000a;
  --blackalpha-100: #0000000f;
  --blackalpha-200: #0000001a;
  --blackalpha-300: #00000029;
  --blackalpha-400: #0000003d;
  --blackalpha-500: #0000005c;
  --blackalpha-600: #0000007a;
  --blackalpha-700: #000000a3;
  --blackalpha-800: #000000cc;
  --blackalpha-900: #000000eb;
  /* boxShadow */
  --15px: 0px 0px 15px 0px #00000026;
  --7px: 0px 0px 7px 0px #00000040;
  --big-box: 0px 3px 6px -4px #0000001f, 0px 6px 16px 0px #00000014,
    0px 9px 28px 8px #0000000d;
}

 

 

 

script.js

 

 

let elInputUsername = document.querySelector('#username')
let elFailureMessage = document.querySelector('.failure-message')
let elSuccessMessage = document.querySelector('.success-message')

const elPassword = document.querySelector('#password')
const elPasswordRe = document.querySelector('#password-retype')
const elMismatch = document.querySelector('.mismatch-message')
const clearmatch = document.querySelector('.clear-message')
const btn = document.querySelector('.signup')

elInputUsername.onkeyup = function () {
  if (isMoreThan4Length(elInputUsername.value)){
    // 성공 메세지 출력
    elSuccessMessage.classList.remove('hide')
    // 실패 메세지 숨기기
    elFailureMessage.classList.add('hide')
  }
  else{
    // 성공 메세지 숨기기
    elSuccessMessage.classList.add('hide')
    // 실패 메시지 출력
    elFailureMessage.classList.remove('hide')

  }
}

elPasswordRe.onkeyup = function(){
  if(isMatch(elPassword.value, elPasswordRe.value)){
      elMismatch.classList.add('hide')
      clearmatch.classList.remove('hide')
  }else{
      elMismatch.classList.remove('hide')
      clearmatch.classList.add('hide')
  }
}

function isMoreThan4Length(value) {
  return value.length >=4
}

function isMatch (password1, password2) {
  return password1 === password2
}

 

 

 

 

출력화면

 

 

 

 

 

 

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

ERROR

 

 

 

실습하던 중 이런 에러를 만났다.

 

 

 

 

에러 해결 방법

 

1. body 소스 뒤로 scipt소스를 넣었는지 확인 해보기

 

구글링 했을 때 이게 문제래서 봤는데 아니였다.

 

2. id/class 명이 정확하게 기입 됐는지 확인 해보기

 

class 명이 잘못 복붙 되어있어서 난 에러였다.

작은 실수지만 한번 놓치면 함수마다 콘솔로그 쳐봐야하는 귀찮음이 있으니 꼭 html

선언 변수로 잘 기입됐는지 더블 체크 해보자

반응형