[JavaScript] 회원가입 예제 (정규표현식 미사용)

2023. 9. 19. 01:47·2023-02 몰입형 SW 정규 교육
728x90

23. 09. 18

 

<!-- <input> 태그의 required 속성: 폼 데이터(form data)가 서버로 제출되기 전 반드시 채워져 있어야 하는 입력 필드를 명시 -->
<!DOCTYPE html>
<html>
  <head>
    <title>유효성 검사 예제</title>
  </head>
  <body>
    <form id="frm">
      <table width="700" height="120" border="1" bordercolor="#CFEFFC">
        <tr>
          <td colspan="2" align="center" bgcolor="#CFEFFC">
            <b>회원 기본 정보</b>
          </td>
        </tr>
        <tr align="center">
          <td width="120px" bgcolor="#E8F7FD">
            <b>아이디</b>
          </td>
          <td align="left">
            <input type="text" id="uid" size="10" maxlength="15" required />
            4~12자의 영문 대소문자와 숫자로만 입력
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>비밀번호</b>
          </td>
          <td align="left">
            <input type="password" id="pw" size="10" maxlength="15" required />
            4~12자의 영문 대소문자와 숫자로만 입력
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>비밀번호 확인</b>
          </td>
          <td align="left">
            <input
              type="password"
              id="pwCheck"
              size="10"
              maxlength="15"
              required
            />
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>메일주소</b>
          </td>
          <td align="left">
            <input type="text" id="mail" size="15" required />
            예) id@domain.com
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>이름</b>
          </td>
          <td align="left">
            <input
              type="text"
              id="userName"
              size="15"
              maxlength="10"
              required
            />
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>집주소</b>
          </td>
          <td align="left">
            <input
              type="text"
              id="zipCode"
              placeholder="우편번호"
              readonly
              required
            />
            <input
              type="button"
              onclick="execDaumPostcode()"
              value="우편번호 찾기"
            />
            <input
              type="button"
              onclick="execDaumPostcodeReset()"
              value="초기화"
            /><br />
            <input
              type="test"
              id="address1"
              placeholder="도로명주소"
              size="40"
              readonly
              required
            /><br />
            <input
              type="text"
              id="address2"
              placeholder="지번주소"
              size="40"
              readonly
            /><br />
            <input
              type="text"
              id="address3"
              placeholder="상세주소"
              size="40"
              required
            />
            <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
          </td>
        </tr>
        <tr>
          <td colspan="2" align="center" bgcolor="#CFEFFC">
            <b>개인 신상 정보</b>
          </td>
        </tr>
        <tr>
          <td align="center" bgcolor="#E8F7FD"><b>주민등록번호</b></td>
          <td>
            <input
              type="password"
              id="unm1"
              size="10"
              maxlength="6"
              placeholder="6자리"
              required
            />
            -
            <input
              type="password"
              id="unm2"
              size="10"
              maxlength="7"
              placeholder="7자리"
              required
            />
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>생일</b>
          </td>
          <td align="left">
            <input
              type="text"
              name="bir"
              id="year"
              size="5"
              maxlength="4"
              required
            />년
            <select name="bir" id="Month">
              <option value="1">1</option>
              <option value="2">2</option>
              <option value="3">3</option>
              <option value="4">4</option>
              <option value="5">5</option>
              <option value="6">6</option>
              <option value="7">7</option>
              <option value="8">8</option>
              <option value="9">9</option>
              <option value="10">10</option>
              <option value="11">11</option>
              <option value="12">12</option>
            </select>
            월
            <select name="bir" id="Day">
              <option value="1">1</option>
              <option value="2">2</option>
              <option value="3">3</option>
              <option value="4">4</option>
              <option value="5">5</option>
              <option value="6">6</option>
              <option value="7">7</option>
              <option value="8">8</option>
              <option value="9">9</option>
              <option value="10">10</option>
              <option value="11">11</option>
              <option value="12">12</option>
              <option value="13">13</option>
              <option value="14">14</option>
              <option value="15">15</option>
              <option value="15">16</option>
              <option value="17">17</option>
              <option value="18">18</option>
              <option value="19">19</option>
              <option value="20">20</option>
              <option value="21">21</option>
              <option value="22">22</option>
              <option value="23">23</option>
              <option value="24">24</option>
              <option value="25">25</option>
              <option value="26">26</option>
              <option value="27">27</option>
              <option value="28">28</option>
              <option value="29">29</option>
              <option value="30">30</option>
              <option value="31">31</option>
            </select>
            일
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>관심분야</b>
          </td>
          <td align="left" id="hobby" required>
            <input type="checkbox" name="01" value="컴퓨터" />컴퓨터
            <input type="checkbox" name="01" value="인터넷" />인터넷
            <input type="checkbox" name="01" value="여행" />여행
            <input type="checkbox" name="01" value="영화감상" />영화감상
            <input type="checkbox" name="01" value="음악감상" />음악감상
          </td>
        </tr>
        <tr align="center">
          <td bgcolor="#E8F7FD">
            <b>자기소개</b>
          </td>
          <td align="left">
            <textarea
              id="my_intro"
              cols="70"
              rows="8"
              maxlength="1000"
              required
            ></textarea>
            <div id="text_count">0 / 1000</div>
          </td>
        </tr>
      </table>
      <table width="650" height="50" border="0" align="center">
        <tr>
          <td align="right">
            <input
              align="center"
              type="button"
              onclick="userCheck()"
              value="가입하기"
            />
          </td>
          <td align="left"><input type="reset" value="다시 입력" /></td>
        </tr>
      </table>
    </form>
    <script src="test2.js"></script>
  </body>
</html>
const userCheck = () => {
  // 아이디 검사
  if (uid.value == "") {
    alert("아이디를 입력하세요.");
    uid.focus();
    return false;
  }

  if (uid.value.length < 4 || uid.value.length > 12) {
    alert("아이디는 영문 대소문자와 숫자 4~12자리로 입력해야 합니다!");
    uid.focus();
    return false;
  }

  for (let i = 0; i < uid.value.length; i++) {
    let ch = uid.value.charAt(i);
    if (
      !(ch >= "0" && ch <= "9") &&
      !(ch >= "a" && ch <= "z") &&
      !(ch >= "A" && ch <= "Z")
    ) {
      alert("아이디는 영문 대소문자와 숫자만 가능합니다.");
      uid.focus();
      return false;
    }
  }

  // 비밀번호 검사
  if (pw.value == "") {
    alert("비밀번호를 입력하세요.");
    pw.focus();
    return false;
  }

  if (uid.value == pw.value) {
    alert("비밀번호는 아이디와 다르게 입력해야 합니다.");
    pw.focus();
    return false;
  }

  if (pw.value.length < 8 || pw.value.length > 25) {
    alert("비밀번호는 영문자+숫자+특수문자 조합으로 8~25자리 사용해야 합니다.");
    pw.focus();
    return false;
  }

  var hasNumber = false;
  var hasLetter = false;
  var hasSpecialChar = false;

  for (let i = 0; i < pw.value.length; i++) {
    let ch = pw.value.charAt(i);
    if (ch >= "0" && ch <= "9") {
      hasNumber = true;
    } else if ((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z")) {
      hasLetter = true;
    } else if ("!@#$%^*+=-".indexOf(ch) != -1) {
      hasSpecialChar = true;
    }
  }

  if (!(hasNumber && hasLetter && hasSpecialChar)) {
    alert("비밀번호는 영문자+숫자+특수문자 조합으로 구성되어야 합니다.");
    pw.focus();
    return false;
  }

  // 비밀번호 확인 검사
  if (pwCheck.value == "") {
    alert("비밀번호 확인을 입력하세요.");
    pwCheck.focus();
    return false;
  }

  if (pwCheck.value != pw.value) {
    alert("비밀번호가 일치하지 않습니다.");
    pwCheck.focus();
  }

  if (pwCheck.value.length < 8 || pwCheck.value.length > 25) {
    alert("비밀번호는 영문자+숫자+특수문자 조합으로 8~25자리 사용해야 합니다.");
    pw.focus();
    return false;
  }

  var hasNumber = false;
  var hasLetter = false;
  var hasSpecialChar = false;

  for (let i = 0; i < pwCheck.value.length; i++) {
    let ch = pwCheck.value.charAt(i);
    if (ch >= "0" && ch <= "9") {
      hasNumber = true;
    } else if ((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z")) {
      hasLetter = true;
    } else if ("!@#$%^*+=-".indexOf(ch) != -1) {
      hasSpecialChar = true;
    }
  }

  if (!(hasNumber && hasLetter && hasSpecialChar)) {
    alert("비밀번호는 영문자+숫자+특수문자 조합으로 구성되어야 합니다.");
    pw.focus();
    return false;
  }

  // 이메일 검사
  if (mail.value == "") {
    alert("이메일을 입력하세요.");
    mail.focus();
    return false;
  }

  var atPos = mail.value.indexOf("@");
  var dotPos = mail.value.lastIndexOf(".");

  if (atPos < 1 || dotPos < atPos + 2 || dotPos + 2 >= mail.length) {
    alert("이메일 형식이 올바르지 않습니다");
    mail.foucs();
    return flase;
  }

  // 이름 검사
  if (userName.value == "") {
    alert("이름을 입력하세요.");
    userName.focus();
    return false;
  }

  if (userName.value.length < 2 || userName.value.length > 4) {
    alert("이름은 한글로 최소 두 글자, 최대 네 글자만 가능합니다.");
    userName.focus();
    return false;
  }

  for (let i = 0; i < userName.value.length; i++) {
    let ch = userName.value.charAt(i);
    let chCode = ch.charCodeAt(0);
    if (!(chCode >= "가".charCodeAt(0) && chCode <= "힣".charCodeAt(0))) {
      alert("한글 이름만 가능합니다.");
      userName.focus();
      return false;
    }
  }

  // 집주소 검사
  if (zipCode.value == "") {
    alert("집주소를 입력하세요.");
    zipCode.focus();
    return false;
  }

  if (address3.value == "") {
    alert("상세주소를 입력하세요.");
    address3.focus();
    return false;
  }

  if (address3.value.length < 2 || address3.value.length > 25) {
    alert(
      "상세주소는 최소 두 글자, 최대 이십오 글자여야 합니다. 예) A동 101호"
    );
    address3.focus();
    return false;
  }

  // 주민등록번호 검사
  if (unm1.value == "" || unm2.value == "") {
    alert("주민번호를 입력하세요.");
    unm1.focus();
    return false;
  }

  var num1 = document.getElementById("unm1");
  var num2 = document.getElementById("unm2");

  if (num1.value.length != 6) {
    alert("주민등록 앞자리는 반드시 여섯 자리여야 합니다");
    num1.focus();
    return false;
  }

  if (num2.value.length != 7) {
    alert("주민등록 뒷자리는 반드시 일곱 자리여야 합니다");
    num2.focus();
    return false;
  }

  for (let i = 0; i < num1.value.length; i++) {
    let ch = num1.value.charAt(i);
    if (!(ch >= "0" && ch <= "9")) {
      alert("주민등록 번호는 숫자만 가능합니다");
      num1.focus();
      return false;
    }
  }

  for (let i = 0; i < num2.value.length; i++) {
    let ch = num2.value.charAt(i);
    if (!(ch >= "0" && ch <= "9")) {
      alert("주민등록 번호는 숫자만 가능합니다");
      num2.foucs();
      return false;
    }
  }

  // 생일
  var birthYear =
    num1.value.substring(0, 2) === "19" || num1.value.substring(0, 2) === "20"
      ? "19"
      : "20";
  year.value = birthYear + num1.value.substring(0, 2);

  var birthMonth = parseInt(num1.value.substring(2, 4));
  var birthDay = parseInt(num1.value.substring(4, 6));

  if (birthMonth < 1 || birthMonth > 12) {
    alert("생년월일이 올바르지 않습니다");
    return false;
  }

  if (birthDay < 1 || birthDay > 31) {
    alert("생년월일이 올바르지 않습니다");
    return false;
  }

  document.getElementById("Month").value = birthMonth;
  document.getElementById("Day").value = birthDay;

  // 관심분야
  var checkboxes = document.getElementsByName("01");
  var isChecked = false;
  for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i].checked) {
      isChecked = true;
      break;
    }
  }

  if (!isChecked) {
    alert("관심분야는 최소 한 개 이상 선택해야 합니다.");
    return false;
  }

  // 자기소개
  var intro = document.getElementById("my_intro");
  if (intro.value == "") {
    alert("자기소개를 입력하세요. (200자 이상, 1000자 이하)");
    intro.focus();
    return false;
  } else if (!(intro.value.length >= 200 && intro.value.length <= 1000)) {
    alert("자기소개는 200자 이상 1000자 이하로 입력해야 합니다.");
    my_intro.focus();
    return false;
  }

  alert("회원가입이 완료되었습니다!");
  window.location.href = `mailto:${mail.value}?subject=회원가입 완료&body=회원가입을 환영합니다.`;
  return true;
};

const execDaumPostcode = () => {
  new daum.Postcode({
    oncomplete: function (data) {
      document.getElementById("zipCode").value = data.zonecode;
      document.getElementById("address1").value = data.address;
      document.getElementById("address2").value = data.jibunAddress;
      document.getElementById("address3").focus();
    },
  }).open();
};

const execDaumPostcodeReset = () => {
  document.getElementById("zipCode").value = null;
  document.getElementById("address1").value = null;
  document.getElementById("address2").value = null;
  document.getElementById("address3").value = null;
};
728x90
저작자표시 비영리 변경금지 (새창열림)

'2023-02 몰입형 SW 정규 교육' 카테고리의 다른 글

[JSP/Servlet] 회원가입  (0) 2023.09.20
웹 프로그래밍 개념 (Web Programming)  (0) 2023.09.19
[JavaScript] 정규표현식을 사용한 회원가입 예제  (0) 2023.09.18
[JavaScript] 정규표현식  (0) 2023.09.18
[JavaScript] ver, let, const 차이점  (0) 2023.09.18
'2023-02 몰입형 SW 정규 교육' 카테고리의 다른 글
  • [JSP/Servlet] 회원가입
  • 웹 프로그래밍 개념 (Web Programming)
  • [JavaScript] 정규표현식을 사용한 회원가입 예제
  • [JavaScript] 정규표현식
gxxg
gxxg
함께 일하고 싶은 개발자를 꿈꾸는 예비개발자의 공부 기록
  • gxxg
    공공
    gxxg
  • 전체
    오늘
    어제
    • 분류 전체보기 (138)
      • ☁️ 구름 x 카카오 Deep Dive 풀스택 (7)
        • html, css (1)
        • Java (3)
        • 스프링 MVC (0)
      • 💻 코딩테스트 (89)
        • 백준 (2)
        • programmers (87)
      • SQLD (1)
      • Language (3)
        • Java (2)
        • JavaScript (1)
      • Style Sheet (0)
        • CSS (0)
        • SCSS & SASS (0)
      • DBMS (2)
        • Oracle (2)
        • MySQL (0)
        • postgresql (0)
        • 데이터베이스 기초 이론 (0)
      • React (0)
      • SpringBoot (0)
      • JSP (2)
      • 알고리즘 (0)
      • 2023-02 몰입형 SW 정규 교육 (24)
        • 9월 프로젝트 (8)
      • 벽돌깨기 (4)
      • Etc (4)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현체
    Lv2
    JSP
    프로젝트 구조
    자바스크립트
    오블완
    programmers
    톰캣
    DFS
    티스토리챌린지
    자바
    2단계
    프로그래머스
    POST
    HTML
    Lv0
    javascript
    3단계
    springboot
    이클립스
    회원 관리 시스템
    java
    spring
    CSS
    LV3
    junit 테스트
    코딩테스트
    0단계
    코테
    eclipse
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gxxg
[JavaScript] 회원가입 예제 (정규표현식 미사용)
상단으로

티스토리툴바