HTML <form> 잘 쓰는 법.
이번 글에서는 “HTML <form>
잘 쓰는 법”에 대해 공유하려고한다.
사실 제목은 거창하게 지었지만, 개인적으로 우아한테크코스에 참여하기 전에 알았으면 좋았을 것 같은 <form>
에 대한 내용을 정리해 보았다.
누군가에게는 당연한 내용일 수 있지만, 나처럼 <form>
에 대해 잘 모르는 사람에게 도움이 되었으면 한다.
1. <form>
본론에 들어가기전 <form>
에 대해 간략하게 설명하자면, <form>
은 사용자로부터 값을 입력을 받는 양식을 만들기 위해서 사용한다.
<form>
<label for="name">닉네임 :</label>
<input type="text" name="name" id="name">
<label for="email">이메일 :</label>
<input type="email" name="email" id="email">
<label for="password">비밀번호 :</label>
<input type="password" name="password" id="password">
<button>제출</button>
</form>
입력 양식은 위의 예시와 같이, <form>
내부에 <input>
과 <button>
같은 11개의 하위 요소 중 필요한 요소를 조합하여 만들 수 있다.
2. 사용자 입력 가져오기
-
'submit'
이벤트앞서 말한 것처럼
<form>
은 JavaScript 코드에서 사용자 입력을 가져오기 위해 사용하는데, 이를 위해 사용자의 제출하는 동작을 먼저 감지해야한다.<form> ... <button>제출</button> <form>
const signupForm = document.querySelector('form'); signupForm.addEventListener('submit', event => { event.preventDefault(); // * console.log('제출이 완료되었습니다.'); });
<form>
에는'submit'
이벤트를 바인드 해주고,<form>
내부에는<button>
를 추가하면, 클릭과 엔터키를 누르는 동작 대해 제출 동작을 감지할 수 있다.이를 몰랐을 때는 ‘확인’ 이나 ‘제출’ 이라는 버튼을 만들고, 클릭 이벤트와 엔터키를 누르는 동작에 대한 이벤트를 매번 모든 입력창에 바인드 했었다. 다소 번거로운 작업이었다.
*
'submit'
이벤트는 양식을 제출하는 고유 동작(페이지 이동 혹은 새로고침)이 함께 발생하는데,preventDefault()
를 사용하여 이를 막아줄 수 있다. -
<input>
의 value사용자의 제출 동작을 감지했다면, 이제 사용자가 입력한 정보를 가져올 수 있다.
'submit'
을 통해 이벤트가 발생하면,event
의target
을 통해name
속성을 지정한 요소의 값이 함께 전달된다. 이를 통해<input>
의value
를 가져올 수 있다.const signupForm = document.querySelector('form'); signupForm.addEventListener('submit', event => { event.preventDefault(); const nameInput = event.target['name']; console.log(nameInput); console.log(`제출된 닉네임은 ${nameInput.value}입니다.`); });
이 방식 몰랐을 때는
<input>
에id
를 지정해주고,querySelector
로 하나씩 선택하여value
를 가져왔었다. 이 또한 다소 번거러운 작업이었다. -
<input>
의 type<input>
은'type'
속성을 사용하면 데이터 형식을 지정할 수 있다.<form> ... <input type="text" name="name" id="name"> ... <input type="email" name="email" id="email"> ... <input type="password" name="password" id="password"> ... </form>
데이터가 반드시 이메일 형식을 포함해야 하거나 자동으로 별표나 원으로 마스킹된다. 예시에서 사용한 이메일과 비밀번호 외에도 숫자, 날짜, 파일 등 22가지
'type'
이 있다.* 그 외 속성
<input>
에는'type'
외에도 여러가지 속성들이 있다. 자주 사용했던 몇 가지 속성만 소개하려고 한다.속성 설명 placeholder
'placeholder'
를 사용하면 입력해야할 데이터 형식의 예시나 간단한 설명을 표시할 수 있다.<input>
내부에 쓰여있지만,'value'
는 아니다.required
'required'
를 사용하면 해당<input>
을 필수로 작성해야 한다고 지정할 수 있다. 만약 입력 되지 않을 경우, 입력해 달라는 안내 문구가 나온다.autofocus
'autofocus'
를 사용하면 해당<input>
이 페이지가 로드될 때 자동으로 포커스를 갖는다. -
<input>
과<label>
<label>
을 사용하면<input>
에 이름을 붙일 수 있는데,<label>
의'for'
의 값과<input>
의'id'
의 값이 같으면 연결된다.<form> <label for="name">닉네임 :</label> <input type="text" name="name" id="name" required> ... </form>
<label>
을 클릭하면, 연결된<input>
에 입력할 수 있도록 포커스 되거나 토글 된다.<input>
에 focus가 오면 스크린리더가<label>
을 읽기 때문에 접근성 측면에서 중요하다. -
<button>
의 type<form>
의<button>
은'submit'
,'reset'
,'button'
세가지 타입을 지원한다.<button type="submit"></button> <button type="reset"> </button> <button type="button"> </button>
'submit'
은 사용자 입력 양식을 제출하는 역할을 하고,'reset'
은 사용자 입력 양식을 초기화하는 역할을 하며,'button'
은 그 외에 기능을 바인딩 하여 사용할 수 있다.<form>
의<button>
은 기본 타입이'submit'
이지만, 접근성 측면에서 타입을 명시적으로 써주는 게 좋다. 또한'submit'
역할을 하는<button>
은<form>
내에 하나만 존재하는 것을 권장한다.이 세가지 타입은
<input>
에도 똑같이 존재하며 작동하는 기능도 일치한다. 차이가 있다면<button>
은<input>
과 달리 다른 엘리먼트들을 삽입할 수도 있으며, 더 자유롭게 스타일링이 가능하다.
3. 마무리
이 글은 서론에서도 말한 것처럼 실제 <form>
을 사용하면서 알게된 점을 공유하고자 작성하였다.
그래서 글을 읽으면서 <form>
에 대한 자세한 레퍼런스가 생략되어 있다는 생각이 들었을 수도 있을 것 같다.
혹시 그런 생각이 들었다면, 참고 자료에 <form>
에 대해 잘 정리되어 있는 블로그 글이 있으니 한번 읽어보는 것을 추천한다.