HTML,CSS, JS/JavaScript

[JavaScript] 24. JavaScript를 사용한 회원 가입 만들기 (3)

Song hyun 2024. 8. 23. 13:26
728x90
반응형

[JavaScript] 24. JavaScript를 사용한 회원 가입 만들기 (3)

 

 

1. sign-up.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>회원가입 by JS</title>
    <link rel="stylesheet" href="../css/common.css" />
    <link rel="stylesheet" href="../css/header.css" />
  </head>
  <body>
    <!-- 헤더 섹션과 네비게이션 메뉴 영역  -->
    <header>
      <nav class="nav-container">
        <div class="nav-item">
          <span class="menu-link">게시판</span>
        </div>
        <div class="nav-item">
          <span class="menu-link">로그인</span>
          <span class="menu-link">회원가입</span>
        </div>
      </nav>
    </header>

    <main class="content-wrapper">
      <!-- 회원 가입 제목 영역  -->
      <section class="form-title">
        <h1>회원가입 by JS</h1>
      </section>

      <!-- 회원 가입 폼 영역 -->
      <section>
        <form action="" onsubmit="return false;">
          <table>
            <tr>
              <th>아이디</th>
              <td>
                <input type="text" class="inputs" placeholder="아이디를입력하세요" value="tenco1" />
                <button type="button" id="checkIdBtn" class="btn-small">중복확인</button>
              </td>
            </tr>
            <tr>
              <th>닉네임</th>
              <td>
                <input type="text" class="inputs" placeholder="닉네임을입력하세요" value="둘리1" />
              </td>
            </tr>
            <tr>
              <th>비밀번호</th>
              <td>
                <input type="password" class="inputs" placeholder="비밀번호을입력하세요" value="1234" />
              </td>
            </tr>
            <tr>
              <th>비밀번호확인</th>
              <td>
                <input type="password" class="inputs" placeholder="비밀번호을입력하세요" value="1234" />
              </td>
            </tr>
          </table>

          <div class="btn-area">
            <button type="button" id="signUpBtn" class="btn">회원가입</button>
          </div>
        </form>
      </section>
    </main>

    <!-- js 파일은 하단에 두는 것이 일반적입니다. 
     모든 HTML 요소가 로드된 후에 스크립트를 실행하기 위함이고 
     페이지 로드 속도를 최적화 하는데 도움이 된다. 
    -->
    <script src="../js/header.js"></script>
    <script src="../js/signUp.js"></script>
  </body>
</html>

 

2. signUp.js

// 1. 변수에 선언과 초기화 
const inputs = document.querySelectorAll(".inputs");
const checkIdBtn = document.getElementById("checkIdBtn");
const signUpBtn = document.getElementById("signUpBtn");
const toDay = new Date(); // 현재 날짜와 시간을 가져오는 객체 

// 로컬스토리지에 접근해서 사용자 정보를 가져오는 함수를 만들어 보자. 
// localStorage <-- 변수를 통해 접근 가능 
function getUserInfo() {
    let userListString = localStorage.getItem("userList");
    if(userListString === null) {
        return [];
    } else {
        // 문자열을(JSON 형식) JS 에 데이터 타입인 객체로 변환 처리 
        return JSON.parse(userListString);
    }
}

const userInfo = getUserInfo();


// 아이디 중복 확인 기능 만들어 보기 
function checkDuplicatedId() {

    const inputUsername = inputs[0].value.trim(); 
    
    if(inputUsername === "") {
        alert('아이디를 입력하세요');
        inputs[0].focus();
        return ; 
    }

    // 로컬스토리지에서 가져온 사용자리스트에서 반복문을 돌면서 inputUsername 에 담기 
    // 같은 값이 있는지 확인 
    let isDuplicatedId = false; 
    for(let i = 0; i < userInfo.length; i++ ) {
        if(userInfo[i].username === inputUsername) {
            isDuplicatedId = true; 
            break;        
        }
    }
    
    if(isDuplicatedId == true) {
        alert('이미 존재하는 아이디입니다.');
        inputs[0].focus();
    } else {
        alert('사용 가능한 아이디 입니다.');
        inputs[0].readOnly = true; 
        inputs[0].style.backgroundColor = "green";    
    }
}

// 회원가입 처리 함수
function registerUser(){
    const username=inputs[0];
    const nickname=inputs[1];
    const password=inputs[2];
    const confirmPassword=inputs[3];

    // 유효성 검사
    if(username.readOnly==false){
        alert('아이디 중복 확인을 해주세요.');
        username.focus();
        return;
    }

    if(nickname.value.trim()==+""){
        alert('닉네임을 입력하세요.');
        nickname.focus();
        return;
    }

    if(password.value.trim()===""){
        alert('비밀번호를 입력하세요.');
        nickname.focus();
        return;
    }

    if(confirmPassword.value.trim()===""){
        alert('비밀번호를 입력하세요.');
        nickname.focus();
        return;
    }

    if(password.value !== confirmPassword.value){
        alert('비밀번호가 일치하지 않습니다.');
        password.focus();
        return;
    }

    // 자바 스크립트에서 객체를 생성하는 방법 2가지
    // 1. new 키워드 사용
    // 2. 객체 리터럴 사용

    // 새로운 사용자 정보를 객체 리터럴로 생성
    const newUser = {
        username: username.value,
        nickname: nickname.value,
        password: password.value,
        createdAt: toDay.getFullYear ()+ "." + (toDay.getMonth()+1)+"."+toDay.getDate()
    };

    // [{},{},{}] : 자료구조
    userInfo.push(newUser);
    // 로컬 스토리지에 자료구조를 통으로 덮어쓰기 저장
    localStorage.setItem('userList',JSON.stringify(userInfo));

    // 로그인 페이지로 이동 처리
    window.location.href="sign-in.html";
}

// 이벤트 리스너 등록 처리 
function addEventListener() {
    checkIdBtn.addEventListener('click', checkDuplicatedId);
    signUpBtn.addEventListener('click', registerUser);
}

// 이벤트 리스너 함수 실행(호출)
addEventListener();
728x90
반응형