학원/실습

*64일차 실습

pringspring 2022. 4. 27. 16:25

@회원가입 유효성검사

        회원가입시 각 필드마다 유효성 검사를 하여 처리 할 수 있도록 만들어라. 
        1. ID는 영어소문자,숫자만 가능해야함(4~12자리,소문자로 시작해야함)
        2. 비밀번호는 숫자/문자/특수문자*!& 포함 형태의 8~15자리
        3. 비밀번호와 비밀번호확인은 같아야 함
        4. 이름은 무조건 한글만 가능해야 함(최소2글자 이상)
        5. 주민번호는 자릿수6자리,7자리이고, 모두 숫자여야함.
        6. 이메일은 @가 포함 되어야 함(@앞에가 영문자,숫자로  4~12글자 ) 
        7. 전화번호는 첫번째 필드는 010만 입력 가능 해야 함
                    두번째 필드는 3자리 이상 입력 해야 함
                    세번째 필드는 무조건 4자리 입력 해야함
                    (모두 숫자만 가능 해야함)
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>유효성검사</title>
    <style>
      table#enroll {
        border: 1px solid;
        border-spacing: 10px;
        width: 500px;
        margin: 0 auto;
      }
      table#enroll th {
        text-align: right;
      }
      table#enroll td.btn-wrapper {
        text-align: center;
      }
      .phone {
        width: 30px;
      }
      span.req {
        color: red;
      }
      .short {
        width: 50px;
      }
    </style>
  </head>
  <body>
    <h3>회원가입 유효성검사</h3>
    <p>
      회원가입시 각 필드마다 유효성 검사를 하여 처리 할 수 있도록 만들어라.
      <br />
      1. ID는 영어소문자,숫자만 가능해야함(4~12자리,소문자로 시작해야함) <br />
      2. 비밀번호는 숫자/문자/특수문자(*!&) 포함 형태의 8~15자리<br />
      3. 비밀번호와 비밀번호확인은 같아야 함<br />
      4. 이름은 무조건 한글만 가능해야 함(최소2글자 이상)<br />
      5. 주민번호는 자릿수6자리,7자리이고, 모두 숫자여야함.<br />
      6. 이메일은 @가 포함 되어야 함(@앞에가 영문자,숫자로 4~12글자 ) <br />
      7. 전화번호는 첫번째 필드는 010만 입력 가능 해야 함 <br />
      두번째 필드는 3자리 이상 입력 해야 함 <br />
      세번째 필드는 무조건 4자리 입력 해야함 <br />
      (모두 숫자만 가능 해야함) <br />
    </p>
    <form action="javascript:alert('제출성공');" name="memberFrm">
      <!-- table#enroll>(tr>th+td)*10 -->
      <table id="enroll">
        <tr>
          <th>아이디<span class="req">*</span></th>
          <td>
            <input type="text" name="userId" id="userId" />
          </td>
        </tr>
        <tr>
          <th>비밀번호<span class="req">*</span></th>
          <td>
            <input type="password" name="pwd" id="pwd" />
          </td>
        </tr>
        <tr>
          <th>비밀번호확인</th>
          <td>
            <input type="password" id="pwdCheck" />
          </td>
        </tr>
        <tr>
          <th>이름<span class="req">*</span></th>
          <td>
            <input type="text" name="userName" id="userName" />
          </td>
        </tr>
        <tr>
          <th>주민번호<span class="req">*</span></th>
          <td>
            <input type="text" name="ssn1" id="ssn1" class="short" />-
            <input type="password" name="ssn2" id="ssn2" class="short" />
          </td>
        </tr>
        <tr>
          <th>이메일<span class="req">*</span></th>
          <td>
            <input type="email" name="email" id="email" />
          </td>
        </tr>
        <tr>
          <th>전화번호<span class="req">*</span></th>
          <td>
            <!-- input:text[name=tel$]#tel$.phone*3 -->
            <input type="text" name="tel1" id="tel1" class="phone" />-
            <input type="text" name="tel2" id="tel2" class="phone" />-
            <input type="text" name="tel3" id="tel3" class="phone" />
          </td>
        </tr>
        <tr>
          <th>직업</th>
          <td>
            <select name="job" id="job">
              <option value="공무원">공무원</option>
              <option value="개발자">개발자</option>
              <option value="무직">무직</option>
            </select>
          </td>
        </tr>
        <tr>
          <th>취미</th>
          <td>
            <!-- (input:checkbox#hobby$[name=hobby]+label[for=hobby$])*5 -->
            <input type="checkbox" name="hobby" id="hobby1" value="reading" />
            <label for="hobby1">독서</label>
            <input
              type="checkbox"
              name="hobby"
              id="hobby2"
              value="development"
            />
            <label for="hobby2">개발</label>
            <input type="checkbox" name="hobby" id="hobby3" value="exercise" />
            <label for="hobby3">운동</label>
            <input type="checkbox" name="hobby" id="hobby4" value="game" />
            <label for="hobby4">게임</label>
            <input type="checkbox" name="hobby" id="hobby5" value="movie" />
            <label for="hobby5">영화</label>
          </td>
        </tr>
        <tr>
          <td colspan="2" class="btn-wrapper">
            <input type="submit" value="제출" />&nbsp;
            <input type="reset" value="초기화" />
          </td>
        </tr>
      </table>
    </form>
    <script>
      document.memberFrm.onsubmit = function () {
        const userId = document.getElementById("userId");
        const pwd = document.getElementById("pwd");
        const pwdCheck = document.getElementById("pwdCheck");
        const userName = document.getElementById("userName");
        const email = document.getElementById("email");
        const ssn1 = document.getElementById("ssn1");
        const ssn2 = document.getElementById("ssn2");
        const tel1 = document.getElementById("tel1");
        const tel2 = document.getElementById("tel2");
        const tel3 = document.getElementById("tel3");

        //1.아이디검사
        //첫글자는 반드시 영소문자로 이루어지고,
        //숫자가 하나이상 포함되어야함.
        //아이디의 길이는 4~12글자사이
        const regExp1 = /^[a-z][a-z\d]{3,11}$/;
        const regExp2 = /[0-9]/;
        // if(!regExpTest(regExp1
        //               ,userId
        //               ,"아이디는 영소문자로 시작하는 4~12글자입니다."))
        //     return false;
        // if(!regExpTest(regExp2
        //               ,userId
        //               ,"아이디는 숫자를 하나이상 포함하세요."))
        //     return false;

        //2.비밀번호 확인 검사
        //숫자/문자/특수문자/ 포함 형태의 8~15자리 이내의 암호 정규식
        //전체길이검사 /^.{8,15}$/
        //숫자하나 반드시 포함 /\d/
        //영문자 반드시 포함 /[a-zA-Z]/
        //특수문자 반드시 포함  /[\*!&]/

        const regExpArr = [/^.{8,15}$/, /\d/, /[a-zA-Z]/, /[\*!&]/];

        for (let i = 0; i < regExpArr.length; i++) {
          if (
            !regExpTest(
              regExpArr[i],
              pwd,
              "비밀번호는 8~15자리 숫자/문자/특수문자를 포함해야합니다."
            )
          ) {
            return false;
          }
        }

        //비밀번호일치여부
        if (!isEqualPwd()) {
          return false;
        }

        //3.이름검사
        //한글2글자 이상만 허용.
        const regExp3 = /^[가-힣]{2,}$/;
        if (!regExpTest(regExp3, userName, "한글2글자이상 입력하세요."))
          return false;

        //4.주민번호체크
        const regExp4 = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[01])$/;
        const regExp5 = /^[1234]\d{6}$/;
        if (!regExpTest(regExp4, ssn1, "숫자만 입력하세요.")) return false;
        if (!regExpTest(regExp5, ssn2, "숫자만 입력하세요.")) return false;

        if (!ssnCheck(ssn1.value, ssn2.value)) {
          alert("올바른 주민번호가 아닙니다.");
          return false;
        }

        //5.이메일 검사
        // 4글자 이상(\w = [a-zA-Z0-9_], [\w-\.]) @가 나오고
        // 1글자 이상(주소). 글자 가 1~3번 반복됨
        if (
          !regExpTest(
            /^[\w]{4,}@[\w]+(\.[\w]+){1,3}$/,
            email,
            "이메일 형식에 어긋납니다."
          )
        )
          return false;

        //6. 전화번호 검사
        // 전화번호 앞자리는 010, 두번째 자리는 3~4자리 숫자, 세번째 자리는 4자리 숫자
        if (!regExpTest(/^010$/, tel1, "번호 2자리 이상 입력")) return false;
        if (!regExpTest(/^[0-9]{3,4}$/, tel2, "번호 3자리 이상 입력"))
          return false;
        if (!regExpTest(/^[0-9]{4}$/, tel3, "4자리 번호 입력")) return false;

        return true;
      };

      function ssnCheck(ssn1, ssn2) {
        const ssn = ssn1 + ssn2;
        /*
			주민등록번호 체계 및 유효성 검사 (javascript)	
			https://eyecandyzero.tistory.com/240	

			//900909-1234561
			const total = 9*2 + 0*3 + 0*4 + 9*5 + 0*6 + 9*7 + 1*8 + 2*9 + 3*2 + 4*3 + 5*4 + 6*5;//220
            const result = total%11;//0
			result = 11-0;//11
			result = result%10;//1

			if(result == 13번째자리수) return true;
			else return false;

        */
        let total = 0;
        for (let i = 0; i < 12; i++) {
          if (i < 8) {
            total += parseInt(ssn.substr(i, 1)) * (i + 2);
          } else {
            total += parseInt(ssn.substr(i, 1)) * (i - 6);
          }
        }
        //마지막수와 비교할 수 구하기
        const result = (11 - (total % 11)) % 10;
        //마지막수(13번째 자리)
        const num13 = parseInt(ssn.substr(12, 1));
        //결과
        if (result == num13) return true;
        else return false;
      }

      function isEqualPwd() {
        if (pwd.value == pwdCheck.value) {
          return true;
        } else {
          alert("비밀번호가 일치하지 않습니다.");
          pwd.select();
          return false;
        }
      }

      function regExpTest(regExp, el, msg) {
        if (regExp.test(el.value)) return true;
        //적합한 문자열이 아닌 경우
        alert(msg);
        el.value = "";
        el.focus();
        return false;
      }
    </script>
  </body>
</html>