DEVELOPMENT/JavaScript
[JS] 간단 회원가입 Form 만들기
Watnu
2024. 4. 24. 01:10
실행 결과 미리 보기

Today's
목표
1. 회원가입 완료시 유저에게 보여줄 환영인사 메시지 구현하기
2. input 요소에 입력된 value를 다루기
추가 목표
1. 모든 항목은 필수 입력 항목이어야 한다
2. submit 이벤트가 발생했을 때 새로고침이 일어나지 않아야 한다
코드리뷰
01. Main
<body>
<div class="container">
<header class="logo">
<img src="images/ozcoding_logo.png" alt="logo">
</header>
<form class="form-input">
<h4 class="form-title">회원가입</h4>
<div class="input-name">
<label for="name">이름<b style="color: red;">*</b></label>
<input type="text" id="name" name="name" placeholder="이름을 입력해주세요" required maxlength="15">
</div>
<div class="input-email">
<label for="email">이메일
<span style="color: blue; font-size: 11px;">*로그인 시 아이디로 사용합니다.</span>
</label>
<input type="email" id="email" name="email" required placeholder="이메일 (ex@ozcoding.com)">
</div>
<div class="input-birth">
<label for="birth">생년월일<b style="color: red;">*</b></label>
<input type="date" id="birth" name="birth" required >
</div>
<div class="input-sex">
<div>성별<b style="color: red;">*</b></div>
<ul class="sex-list">
<li class="sex-woman">
<input type="radio" id="woman" name="gender" >
<label for="woman">여자</label>
</li>
<li class="sex-man">
<input type="radio" id="man" name="gender" >
<label for="man">남자</label>
</li>
</ul>
</div>
<div class="input-tel">
<div class="tel-nav">
<div class="tel-text">휴대전화<b style="color: red;">*</b></div>
<button class="tel-verification">인증하기</button>
</div>
<div class="tel-info">
<select id="tel-fir" name="phone">
<option value="010" selected>010</option>
<option value="011">011</option>
<option value="016">016</option>
<option value="017">017</option>
</select>
<span class="tel-text">-</span>
<input type="text" name="phone" minlength="4" maxlength="4">
<span class="tel-text">-</span>
<input type="text" name="phone" minlength="4" maxlength="4">
</div>
</div>
<div class="input-password">
<label for="password">비밀번호
<span style="color: #0040FF; font-size: 11px;">*6~15자의 영문 대/소문자,숫자,기호 조합</span>
</label>
<input type="password" id="password" name="password" placeholder="비밀번호를 입력해주세요" required minlength="6" maxlength="15">
</div>
<div class="input-check">
<div class="checkbox">
<input type="checkbox" class="input-checkbox" id="check-age" name="checkbox01" required>
<label for="check-age">만 14세 이상입니다. (필수)</label>
</div>
<div class="checkbox">
<input type="checkbox" class="input-checkbox" id="check-service" name="checkbox02" required>
<label for="check-service">서비스 이용약관동의 (필수)</label>
<span><u>내용보기</u></span>
</div>
</div>
<button class="submit-btn" type="submit">가입하기</button>
</form>
<script src="script.js"></script>
</div>
</body>
- input 요소중 회원가입에 필요한 type
text / email / birth / radio / password / checkbox
= input에 required 요소를 넣으면 HTML자체에서 필수입력으로 인식해서 걸러준다
html, body{
height: 100%;
margin: 0;
box-sizing: border-box;
}
/* 회원가입 form 제출시 기존 form 숨기기 className */
.hidden{
display: none;
}
body{
font-size: 15px;
display: flex;
justify-content: center;
align-items: center;
}
.logo{
height: 50px;
margin: 0px;
background-color: #000000;
border-radius: 15px 15px 0px 0px;
text-align: center;
line-height: 60px;
}
.logo > img{
width: 100px;
height: auto;
}
.container{
width: 360px;
height: 740px;
background-color: #FFFFFF;
border-radius: 15px;
box-shadow: 1px 1px 1px 5px #00E09A ,3px 3px 1px 10px #0A7E58, 5px 5px 1px 15px #141517;
position: relative;
}
.form-input{
width: 320px;
height: 660px;
padding-left: 10px;
padding-right: 10px;
border-radius: 30px;
border: solid 0.05em #dfe4ea;
position: absolute;
left: 9px;
bottom: 14px;
}
input[type=text], input[type=email], input[type=date], input[type=password] {
width: 310px;
height: 35px;
border: solid 0.05em #dfe4ea;
border-radius: 5px;
}
/* 핸드폰 input box */
select, .tel-info > input[type=text]{
width: 100px;
height: 35px;
border: solid 0.05em #dfe4ea;
border-radius: 5px;
}
.tel-nav{
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 5px;
}
.tel-info{
display: flex;
}
.input-name{
margin-bottom: 20px;
display: flex;
flex-direction: column;
}
.input-email{
margin-bottom: 20px;
display: flex;
flex-direction: column;
}
.input-birth{
margin-bottom: 20px;
display: flex;
flex-direction: column;
}
.input-sex{
margin-bottom: 20px;
display: flex;
flex-direction: column;
position: relative;
}
.input-tel{
margin-bottom: 20px;
display: flex;
flex-direction: column;
}
.input-password{
margin-bottom: 20px;
display: flex;
flex-direction: column;
}
input, select{
margin-bottom: 3px;
}
input:focus{
outline-color: #0040FF;
}
.tel-verification{
cursor: pointer;
width: 70px;
height: 30px;
color: #FFFFFF;
background-color: #0040FF;
border: none 0.05em #dfe4ea;
border-radius: 5px;
}
.tel-verification:hover{
background-color: #3064ff;
}
ul{
list-style-type:none;
}
.sex-list{
display: flex;
flex-direction: column;
margin: 0px 0px -5px -45px;
}
.checkbox > span > u{
cursor: pointer;
}
u:hover{
color: #0040FF;
}
.submit-btn{
cursor: pointer;
width: 320px;
height: 40px;
font-weight: 900;
margin-top: 10px;
border: none 0.05em #dfe4ea;
border-radius: 5px;
background-color: #0040FF;
color: #FFFFFF;
}
.submit-btn:hover{
background-color: #3064ff;
}
- form에 class='hidden' 을 추가해서 form이 제출되면 회원가입 form이 안보이게하기
const form = document.querySelector('.form-input');
const container = document.querySelector('.container');
const HIDDEN_CLASSNAME = 'hidden'; //자주쓰는 className String으로 저장해둠
let greeting = document.createElement('h1');
greeting.classList.add(HIDDEN_CLASSNAME);
greeting.style.textAlign='center';
//핸드폰 인증버튼 구현X 안내 alert
const telVerification = document.querySelector('.tel-verification');
telVerification.addEventListener('click',function(){
alert('아직 구현되지 않은 버튼입니다.')
})
form.addEventListener('submit', function(e){
e.preventDefault(); //새로고침 방지
//바뀌는 값이긴한데 submit할때마다 변수가 새로 계속 생성되서 const 사용해도 괜찮다
let userName = e.target.name.value;
let userEmail = e.target.email.value;
let userBirth = e.target.birth.value;
let userGender = e.target.gender.value;
let userPhone = e.target.phone.value;
let userPassword = e.target.password.value;
form.classList.add(HIDDEN_CLASSNAME);
greeting.innerText = `${userName}님\n 환영합니다!`;
container.appendChild(greeting);
greeting.classList.remove(HIDDEN_CLASSNAME);
console.log(greeting);
})
// 패스워드 형식 체크
// 이메일 형식 체크
// checkbox값 각각 다 들고와서 True/False &&연산자로 확인후 alert창띄우기
- 자주 사용하는 상수는 변수로 만들어 놓기
const HIDDEN_CLASSNAME = 'hidden';
처럼 변수명은 대문자로만 입력하기 - Form은 제출되면 새로고침이 자동으로 진행된다
e.preventDefault(); 으로 새로고침방지 - 회원가입에서 input으로 얻어지는 값들은 const로 선언해도 된다
= 바뀌는 값이긴한데 submit할때마다 변수가 새로 계속 생성되서 const 로 변수선언해도 괜찮다
마무리
보완해야 할 점
1. HTML 에서 Password의 조건을 *6~15자의 영문 대/소문자,숫자,기호 조합 으로 안내했지만 코드내부에서
해당 조건을 확인하는 코드가 없다 (필요함)
추후 공부 할 내용
1. 핸드폰 인증은 보통 휴대폰 본인인증 api 를 들고와서 연결한다