본문 바로가기

퍼블리싱/JavaScript

[javascript]회원가입 페이지 구현하기

회원가입 페이지 구현하기

[Javascript] 구현할 내용

1. 핸드폰 번호 기입 시 자동으로 다음 칸 넘어가기

2. 핸드폰 번호 전체 기입 시 인증번호 전송 버튼 활성화시키기 / 토큰 생성 후 화면 표출 / 3분 타이머 시작 / 인증완료 버튼 활성화

3. 3분 이내 클릭 시 '인증 완료' alert 창 생성 / 3분 지나면 전체 초기화

4. 가입하기 버튼 클릭 시 전체 유효성 검사(오류 메시지 표출)

5. 검증 완료 후 가입 축하 메시지 alert 창 생성

회원가입 페이지(default/active)


1. 핸드폰 번호 기입 시 자동으로 다음 칸 넘어가기

1) 핸드폰 번호 칸 [3자리]-[4자리]-[4자리]

2) 핸드폰 번호를 담는 변수

3) input 안의 value값을 확인해서 자릿수 조건을 만족하면 다음 칸으로 이동

 

1. 핸드폰 번호 기입 시 자동으로 다음 칸 넘어가기

<html>

- 각 칸의 숫자의 길이를 maxlength를 이용하여 제한해 둠 : [3자리]-[4자리]-[4자리]

- 인증번호 전송 버튼 disabled 처리

        <!-- 2. 핸드폰번호, 인증번호 전송, 인증 완료 -->
        <div class="phone__group">
            <div class="phone__number">
                <div class="phone__number__box">
                    <input id="phoneNum1" type="text" maxlength="3" oninput="phoneNum1()" /> -
                    <input id="phoneNum2" type="text" maxlength="4" oninput="phoneNum2()" /> -
                    <input id="phoneNum3" type="text" maxlength="4" oninput="phoneNum3()" />
                </div>
                <button id="tokenBtn" class="btn__disabled__stroke" disabled onclick="getToken()">인증번호</button>
            </div>
            <div class="phone__timer">
                <div class="timer__token">
                    <span id="token" class="token">000000</span>
                    <span id="timer" class="timer">3:00</span>
                </div>
                <button id="tokenConfrimBtn" class="btn__disabled__stroke" disabled onclick="confrimPopup()">인증 완료</button>
            </div>
        </div>

<javascript>

- 변수 만들기 : phoneNum1,  phoneNum2, PhoneNum3

- input 안의 value 값 확인하기

- 조건문 생성(value의 length가 '(지정된 수)'와 일치)

- 조건이 맞으면 다음 칸으로 focus

- [3자리]-[4자리]-[4자리] 조건 성립 시 인증번호 버튼 활성화시키기 (인증번호 전송 버튼 disabled 해제)

let phoneNum1 = () => {
    let phoneNum1 = document.getElementById('phoneNum1').value;
    if (phoneNum1.length === 3) {
        document.getElementById('phoneNum2').focus();
    }
};
let phoneNum2 = () => {
    let phoneNum2 = document.getElementById('phoneNum2').value;
    if (phoneNum2.length === 4) {
        document.getElementById('phoneNum3').focus();
    }
};
let phoneNum3 = () => {
    let phoneNum1 = document.getElementById('phoneNum1').value;
    let phoneNum2 = document.getElementById('phoneNum2').value;
    let phoneNum3 = document.getElementById('phoneNum3').value;
    if (phoneNum1.length === 3 && phoneNum2.length === 4 && phoneNum3.length === 4) {
        // 인증번호 버튼 active
        document.getElementById('tokenBtn').removeAttribute('disabled');
        document.getElementById('tokenBtn').className = 'btn__stroke';
    }
};

2. 핸드폰 번호 전체 기입 시 인증번호 전송 버튼 활성화 / 토큰 생성 / 3분 타이머 / 인증 완료 버튼 활성화

1) 인증번호 버튼 활성화 

2) 인증번호 버튼 클릭 시 토큰 생성 & 인증번호 버튼 비활성화

3) 3분 타이머 스타트

4) 인증 완료 버튼 활성화

2. 버튼 활성화, 토큰 생성, 3분 타이머

<javascript>

- 토큰 생성하는 함수 : getToken()

const getToken = () => {
    let token = String(Math.floor(Math.random() * 1000000)).padStart(6, '0');
    document.getElementById('token').innerText = token;
    document.getElementById('token').style.color = '#000';
    // 1. 토큰 받은 후 다시 인증번호 전송 버튼 disabled 변경
    document.getElementById('tokenBtn').setAttribute('disabled', 'true');
    document.getElementById('tokenBtn').className = 'btn__disabled__stroke';
    // 2. 인증 완료 버튼 active 변경
    document.getElementById('tokenConfrimBtn').removeAttribute('disabled');
    document.getElementById('tokenConfrimBtn').className = 'btn__fill';
    // 3. 3분 타이머 시작
    timer();
};

- 3분 타이머 : timer()

- setInterval(), clearInterval()

* 3분 타임아웃 됐을 때 전체 초기화 작업 필요! (토큰, 버튼, 타이머 초기화)

let interval;
const timer = () => {
    let time = 180;

    interval = setInterval(() => {
        let min = Math.floor(time / 60);
        let sec = String(time % 60).padStart(2, '0');
        document.getElementById('timer').innerText = `${min}:${sec}`;

        if (time >= 0) {
            time--;
        } else {
            // 타임 아웃 됐을 때 다시 전체 초기화 상태
            // 1) token 초기화
            document.getElementById('token').innerText = '000000';
            document.getElementById('token').style.color = '#999999';
            // 2) 인증완료 버튼 disabled
            document.getElementById('tokenConfrimBtn').setAttribute('disabled', 'true');
            document.getElementById('tokenConfrimBtn').className = 'btn__disabled__stroke';
            // 3) timer 초기화
            document.getElementById('timer').innerText = '3:00';
            clearInterval(interval);
        }
    }, 1000);
};

3. 3분 이내 클릭 시 '인증 완료' alert 창 생성 / 3분 지나면 전체 초기화

1) 인증 완료 버튼 클릭

2) 인증 완료 버튼 disabled

3) 인증 완료 안내 alert창 띄우기

4) 가입하기 버튼 활성화

인증 완료!

<javascript>

- timer 중지 : clearInterval()

- alert()

const confrimPopup = () => {
    clearInterval(interval);
    // 1) 인증완료 버튼 disabled
    document.getElementById('tokenConfrimBtn').setAttribute('disabled', 'true');
    document.getElementById('tokenConfrimBtn').className = 'btn__disabled__stroke';
    // 2) 완료 팝업 띄우기
    alert('인증이 완료되었습니다!!!');
    // 3) 가입하기 버튼 active
    document.getElementById('SignupBtn').removeAttribute('disabled');
    document.getElementById('SignupBtn').className = 'btn__active';
};

4. 가입하기 버튼 클릭 시 전체 유효성 검사(오류 메시지 표출)

1) 받아오는 값들 변수로 저장

2) value 값이 비어있는지 확인

3) 비어있거나 형식이 올바르지 않으면 에러 문구 표출

유효성 검사 - error

<javascript>

- 유효성 검사 : 이름, 이메일, 패스워드1, 패스워드2, 패스워드 일치 확인, 지역 선택

- 이메일 : includes() 사용해서 '@' 포함되어 있는지 확인

- 패스워드 1, 패스워드2 일치하는지 확인

const signup = () => {
    let name = document.getElementById('name').value;
    let email = document.getElementById('email').value;
    let password1 = document.getElementById('password1').value;
    let password2 = document.getElementById('password2').value;
    let location = document.getElementById('location').value;

    let isValid = true;
    // 유효성 검사 - 이름
    if (name === '') {
        isValid = false;
        document.getElementById('error__name').innerText = '이름이 올바르지 않습니다.';
        document.getElementById('error__name').style.display = 'block';
    } else {
        document.getElementById('error__name').innerText = '';
        document.getElementById('error__name').style.display = 'none';
    }
    // 유효성 검사 - 이메일
    if (email.includes('@') === false) {
        isValid = false;
        document.getElementById('error__email').innerText = '올바른 이메일 형식이 아닙니다.';
        document.getElementById('error__email').style.display = 'block';
    } else {
        document.getElementById('error__email').innerText = '';
        document.getElementById('error__email').style.display = 'none';
    }
    // 유효성 검사 - 패스워드 1
    if (password1 === '') {
        isValid = false;
        document.getElementById('error__password1').innerText = '비밀번호를 입력해 주세요.';
        document.getElementById('error__password1').style.display = 'block';
    } else {
        document.getElementById('error__password1').innerText = '';
        document.getElementById('error__password1').style.display = 'none';
    }
    // 유효성 검사 - 패스워드 2
    if (password2 === '') {
        isValid = false;
        document.getElementById('error__password2').innerText = '비밀번호를 입력해 주세요.';
        document.getElementById('error__password2').style.display = 'block';
    } else {
        document.getElementById('error__password2').innerText = '';
        document.getElementById('error__password2').style.display = 'none';
    }
    // 유효성 검사 - 패스워드 1 = 패스워드 2
    if (password1 !== password2) {
        isValid = false;
        document.getElementById('error__password1').innerText = '비밀번호가 일치하지 않습니다.';
        document.getElementById('error__password1').style.display = 'block';
        document.getElementById('error__password2').innerText = '비밀번호가 일치하지 않습니다.';
        document.getElementById('error__password2').style.display = 'block';
    }
    // 유효성 검사 - 지역선택
    if (location !== '서울' && location !== '인천' && location !== '경기') {
        isValid = false;
        document.getElementById('error__location').innerText = '지역을 선택해 주세요.';
        document.getElementById('error__location').style.display = 'block';
    } else {
        document.getElementById('error__location').innerText = '';
        document.getElementById('error__location').style.display = 'none';
    }

    // 올바르게 작성된 경우 - 가입완료!!!
    if (isValid === true) {
        alert('가입을 환영합니다!');
    }
};

5. 검증 완료 후 가입 축하 메시지 alert 창 생성

1) 검증 완료되면 가입 축하 alert 생성

회원가입 완료! 축하합니다!