SEB_FE_44/과제

Validator 유효성 검사

언젠간코딩잘함 2023. 3. 8. 23:00

유효성 검사 후 회원가입 버튼을 구현하는 과제를 진행하였다!

 

HTML

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

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

      <fieldset>
        <input type="password" id="password" placeholder="비밀번호" />
      </fieldset>
      <div class="notStrong-message hide">
        영어, 숫자, 특수문자 미포함, 8자 이상
      </div>

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

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

      <fieldset class="signup">
        <button id="signupBtn">회원가입</button>
      </fieldset>

 

CSS

main.move {
  transform: translateY(-350%);
}

body.dark {
  animation-name: brightness-animation;
  animation-duration: 1.5s;
  animation-iteration-count: 1;
  animation-fill-mode: forwards;
}
@keyframes brightness-animation {
  0% {
    filter: brightness(100%);
  }
  100% {
    filter: brightness(0%);
  }
}

move, dark는 회원가입이 True일 때 버튼을 누르면 동작하게 구현했다.

회원가입창이 위로 올라가고 화면이 어두워진다.

 

animation을 처음 써봤는데 상당히 유용한 것 같다.

-name은 @keyframes으로 동작할 애니메이션의 이름이고

-duration은 동작 시간

-iteration-count는 동작 횟수

-fill-mode는 무슨 값이 있는진 모르겠지만 마지막 상태를 유지하는 forwards값을 넣어줬다

 

 

JS

 

  // -------- 회원가입 조건 ---------
  let loginId = 0;
  let loginPass = 0;
  let loginPass2 = 0;

  // ---------- 아이디 유효성 ----------
  let elInputUsername = document.querySelector("#username");

  let elFailureMessage = document.querySelector(".failure-message");
  let elSuccessMessage = document.querySelector(".success-message");
  let numAndEngMessage = document.querySelector(".numAndEng-message");

  function isMoreThan4Length(value) {
    return value.length >= 4;
  }
  function onlyNumberAndEnglish(str) {
    return /^[A-Za-z][A-Za-z0-9]*$/.test(str);
  }

  // ID 생성 조건
  elInputUsername.onkeyup = function () {
    const id = elInputUsername.value;
    const isOnlyNumAndEng = onlyNumberAndEnglish(id);
    const isMoreThan4 = isMoreThan4Length(id);

    if (isOnlyNumAndEng && isMoreThan4) {
      // 정상
      elSuccessMessage.classList.remove("hide");
      numAndEngMessage.classList.add("hide");
      elFailureMessage.classList.add("hide");
      return (loginId = 1);
    } else if (!isOnlyNumAndEng && isMoreThan4) {
      // 4글자이상 문자 x
      elSuccessMessage.classList.add("hide");
      numAndEngMessage.classList.remove("hide");
      elFailureMessage.classList.add("hide");
    } else if (isOnlyNumAndEng && !isMoreThan4) {
      // 4글자 x 문자 O
      elSuccessMessage.classList.add("hide");
      numAndEngMessage.classList.add("hide");
      elFailureMessage.classList.remove("hide");
    } else if (!isOnlyNumAndEng && !isMoreThan4) {
      // 비정상
      elSuccessMessage.classList.add("hide");
      numAndEngMessage.classList.remove("hide");
      elFailureMessage.classList.remove("hide");
    }
  };

  // [유효성 검증 함수]: 최소 8자 이상하면서, 알파벳과 숫자 및 특수문자(@$!%*#?&) 는 하나 이상 포함

  // ---------- 비밀번호 유효성 -----------
  let password1 = document.querySelector("#password");
  let password2 = document.querySelector("#password-retype");

  let passwordMessage = document.querySelector(".mismatch-message");
  let notStrongMessage = document.querySelector(".notStrong-message");

  function isMatch(password1, password2) {
    return password1 === password2 ? true : false;
  }

  // password match
  password2.onkeyup = function () {
    let passMesClass = passwordMessage.classList;
    if (isMatch(password1.value, password2.value)) {
      passMesClass.add("hide");
      loginPass = 1;
    } else {
      passMesClass.remove("hide");
    }
  };

  function strongPassword(str) {
    return /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/.test(
      str
    );
  }

  // strongPassword
  password1.onkeyup = function () {
    let pass = password1.value;
    if (strongPassword(pass)) {
      notStrongMessage.classList.add("hide");
      loginPass2 = 1;
    } else {
      notStrongMessage.classList.remove("hide");
    }
  };

  // ------------- 회원가입 --------------
  let signupBtn = document.querySelector("#signupBtn");

  signupBtn.addEventListener("click", function () {
    if (loginId === 1 && loginPass === 1 && loginPass2 === 1) {
      document.querySelector("main").classList.add("move");
      document.querySelector("body").classList.add("dark");
    } else {
      alert("아이디와 비밀번호는 장식인가요?");
    }
  });

굳이 회원가입 조건 변수 3개를 만들었나 싶다 😄