폼다루기
입력값 가져오기
value — input, textarea, select의 값
const nameInput = document.querySelector("#name");
console.log(nameInput.value); // 입력된 문자열
nameInput.value = "gori"; // 값 설정도 가능checked — checkbox, radio
const agreeCheckbox = document.querySelector("#agree");
console.log(agreeCheckbox.checked); // true / false
agreeCheckbox.checked = true;select의 선택된 값
<select id="city">
<option value="seoul">서울</option>
<option value="busan">부산</option>
</select>const citySelect = document.querySelector("#city");
console.log(citySelect.value); // "seoul" 또는 "busan"여러 checkbox 중 체크된 것만 모으기
const checked = document.querySelectorAll('input[name="hobby"]:checked');
const values = [...checked].map((el) => el.value);
console.log(values); // ["reading", "movie"]폼 제출 처리
submit 이벤트 — form 전체에 등록
버튼의 click이 아니라 form의 submit 이벤트를 사용하는 것이 기본이다. 버튼 클릭뿐 아니라 입력창에서 엔터를 눌러도 똑같이 감지되기 때문이다.
<form id="signupForm">
<input type="text" name="name" />
<input type="email" name="email" />
<button type="submit">가입</button>
</form>const form = document.querySelector("#signupForm");
form.addEventListener("submit", (event) => {
event.preventDefault(); // 새로고침되는 기본 동작 막기
const name = form.name.value; // form.요소이름 으로도 접근 가능
const email = form.email.value;
console.log({ name, email });
});FormData — 폼 전체 값을 한 번에 꺼내기
입력창이 많을 때 하나씩 querySelector로 꺼내는 대신, FormData로 한 번에 정리할 수 있다.
form.addEventListener("submit", (event) => {
event.preventDefault();
const formData = new FormData(form);
console.log(formData.get("name")); // "gori"
console.log(formData.get("email")); // "gori@example.com"
const data = Object.fromEntries(formData); // 객체로 한번에 변환
console.log(data); // { name: "gori", email: "gori@example.com" }
});폼 유효성 검사
HTML 자체 속성으로 기본 검사
<input type="text" required minlength="4" />
<input type="email" required />
<input type="number" min="0" max="100" />required, minlength, type="email" 같은 속성만으로도 브라우저가 기본적인 검사를 대신해준다. 다만 규칙이 복잡해지면 JS로 직접 검사해야 한다.
JS + 정규표현식으로 유효성 검사
“정규표현식” 글에서 다룬 패턴을 폼 검증에 그대로 적용할 수 있다.
function validateSignup({ id, password, email }) {
const idRegex = /^[a-z0-9]{4,12}$/;
const emailRegex = /^[\w.-]+@[\w.-]+\.\w+$/;
if (!idRegex.test(id)) {
return "아이디는 영문/숫자 4~12자로 입력해주세요";
}
if (password.length < 8) {
return "비밀번호는 8자 이상이어야 합니다";
}
if (!emailRegex.test(email)) {
return "이메일 형식이 올바르지 않습니다";
}
return null; // 문제 없음
}폼 제출과 함께 검사하기
form.addEventListener("submit", (event) => {
event.preventDefault();
const formData = new FormData(form);
const data = Object.fromEntries(formData);
const errorMessage = validateSignup(data);
if (errorMessage) {
alert(errorMessage);
return; // 여기서 멈추고 실제 제출은 하지 않음
}
console.log("검증 통과, 서버로 전송:", data);
});입력마다 실시간으로 검사하기
제출 시점이 아니라, 타이핑하는 동안 바로바로 알려주고 싶다면 input 이벤트와 함께 쓴다. “비동기” 글에서 다룬 디바운스를 함께 쓰면 매 타이핑마다 검사하지 않고 입력이 멈췄을 때만 검사할 수 있다.
const emailInput = document.querySelector("#email");
const emailError = document.querySelector("#emailError");
const checkEmail = debounce(() => {
const emailRegex = /^[\w.-]+@[\w.-]+\.\w+$/;
emailError.textContent = emailRegex.test(emailInput.value)
? ""
: "이메일 형식이 올바르지 않습니다";
}, 300);
emailInput.addEventListener("input", checkEmail);마지막 수정