폼 요소(Element) 선택과 제어
폼과 폼 요소 기초
폼과 폼 요소는 HTML 요소중에서 사용자와 인터렉션을 하는 유일한 방법입니다.
때문에 사용자의 입력이나 선택을 받는데 필요한 다양한 속성들이 존재합니다.
자바스크립트는 이런 폼 요소와 속성들을 완전히 제어할 수 있는 방법을 제공합니다.
폼과 폼 요소들은 기본적으로 이름(name) 속성을 가지고 있습니다. 이름을 통해 개별 폼 및 폼 요소에 접근할 수 있으며, 요소의 속성과 값 또한 접근할 수 있게 됩니다.
폼과 폼 요소에는 HTML 페이지 안에서 고유한 ID 값 또한 사용할 수 있습니다.
ID 값을 사용하면 폼 요소에 빠르게 접근할 수 있지만, ID 를 너무 남발하게 되면, 폼 요소를 식별하는데 오히려 방해가 될 수 있습니다.
ID 값은 선택적으로 사용하는 것이 좋으며, ID 값은 충분히 식별 가능한 이름으로 정해야 합니다.
폼 요소의 이름과 ID는 대소문자를 구분합니다.
자바스크립트 네이밍 규칙에 따라 단어를 조합할 때는 2번째 단어부터는 시작 문자를 대문자로 사용해 정하는 것을 추천합니다.
HTML 페이지 안에 폼이 여러개인 경우 폼 이름 외에 폼 인덱스로 폼을 순서대로 접근할 수 있습니다.
document.forms[1] 은 HTML 페이지 안의 2번째 폼이라는 뜻입니다.
물론 2번째 폼이 있을 때만 접근할 수 있습니다.
전체 폼의 갯순은 document.forms.length 로 접근할 수 있습니다.
따라서 반복문으로 전체 폼을 순환하면서 폼이나 폼 요소에 반복되는 처리를 할 수도 있습니다.
document.forms는 배열 이며, HTML 페이지 안의 각 폼에 대한 참조를 담고 있습니다.
폼에 들어있는 폼 요소들도 폼과 동일하게 배열 참조를 가지고 있습니다.
예를 들어 아래 구문은 문서의 첫번째 폼에 있는 첫번째 요소라는 뜻입니다.
document.forms[0].elements[0];
실제로는 요소까지는 이런 방법으로 접근해서 값을 얻거나 하지는 않습니다.
document.forms.myform.elements.ordername;
과 같은 식으로 요소 이름을 속성으로 해서 접근을 합니다.
폼 요소에는 개별 이름이나 ID 가 있고, 이름 기반으로 값이나 속성에 접근을 하게 됩니다.
폼 요소에 접근하는 방법은 여러가지가 있습니다.
document.form1.getElementById('ID값');document.form1.getElementByName('요소이름');document.form1.getElementByClassName('클래스명');document.form1.querySelector('쿼리선택자');document.form1.querySelectorAll('쿼리선택자');
모두 요소(Element) 를 반환합니다.
getElementByClassName(), querySelectorAll() 두 메서드는 여러개의 요소 선택이 가능하며, HTML 엘리먼트 컬렉션을 반환합니다.
예를 들어 아래와 같은 폼으로 폼 요소의 선택과 제어를 해보겠습니다.
<form name="myform" id="myform" method="post" action="order"> <input type="hidden" name="key" value=""/> <input type="text" name="name" value=""> <input type="tel" name="tel" size="13" maxlength="13" value=""> <fieldset name="options"> <legend>상품옵션</legend> <input type="radio" name="size" value="대과"/> <input type="radio" name="size" value="중과" checked /> <input type="checkbox" name="giftpack" value="선물상자"/> <input type="checkbox" name="giftpack" value="보자기포장"/> <select name="weight"> <option value="1" selected>1Kg</option> <option value="5">5Kg</option> <option value="10">10Kg</option> </select> </fieldset> <fieldset name="buttons"> <button type="button" name="order">주문</button> <button type="button" name="wishlist">찜해놓기</button> </fieldset></form>
폼 요소 선택과 요소 값 얻기
폼 요소 선택하는 방법은 다음처럼 여러가지 방법으로 가능합니다.
const myform = document.forms.myform;
myform.elements.name.value = '주문자명';
console.log(document.forms[0].elements[1].value);console.log(myform.elements.name.value);let ordername = myform.querySelector('input[name="name"]');console.log(ordername.value);
위의 폼 예제에서 요소들을 선택해 값을 얻는 방법을 알아보겠습니다.
const myform = document.forms.myform;
myform.elements.name.value = '주문자명';console.log(myform.elements.name.value);
//라디오박스myform.elements.size[0].checked = true;console.log(myform.elements.size.value);
//체크박스myform.elements.giftpack[1].checked = true;console.log(myform.elements.giftpack.length);let giftpack = []; myform.elements.giftpack.forEach(function(check){ if(check.checked){giftpack.push(check.value);}});console.log(giftpack);
//이벤트 델리게이션으로 버튼 이벤트 처리let buttons = myform.buttons;buttons.addEventListener('click', function(e){ switch(e.target.name){ case 'order': console.log('주문폼 주문 저장!'); //주문폼 전송 처리 break; case 'wishlist': console.log('찜해놓기에 저장!'); //찜해놓기 저장 처리 break; }});
폼 속성 제어
폼 속성은 폼 이름이나 값을 얻는 것과 같은 방법을 사용합니다.
이름(Name)과 값(Value) 또한 하나의 속성이기 때문에 기본적인 폼 속성에 접근하는 방법은 이미 알고 있습니다.
라디오, 체크박스, 콤보리스트의 특징적인 속성들에 접근하는 방법을 알아보겠습니다.
const myform = document.forms.myform;
console.log(document.forms[0].size.length);console.log(myform.elements.giftpack[0].checked);
let weight = myform.querySelector('select[name="weight"]');console.log(weight[0].label);console.log(weight.selectedIndex);
폼 전송
폼 전송은 버튼 타입을 "submit" 으로한 버튼을 클릭하거나, 엘리먼트에 이벤트 리스너를 등록해 클릭 콜백 함수로 폼을 전송하는 등 다양한 방법을 사용할 수 있습니다.
폼 객체를 얻은 후 "submit()" 메서드를 호출하면 폼은 폼 속성에서 지정해놓은 페이지로 전송됩니다.
폼 태그에는 폼 전송에 필요한 여러가지 속성들이 있습니다. 이 속성들 또한 자바스크립트로 설정을 할 수 있습니다.
const myform = document.forms.myform;
form.action = "save.html"; // 폼을 전송할 페이지form.enctype = "multipart/form-data"; // 폼의 인코딩 타입 지정. 첨부파일이 있을 경우 등의 바이너리 데이터에 대한 대응 속성form.onsubmit = "return checkForm()"; //폼 전송전 폼 체크와 같은 전처리 함수를 호출한 후 폼 전송form.submit(); //폼 전송
폼 태그에 사용 가능한 속성들은 다음과 같습니다.
속성 |
사용 가능 값 |
method |
GET, POST 사용 가능. 폼 데이터를 전송하는 전송 방식을 결정 |
action |
경로및 폼 데이터를 수신할 페이지 |
enctype |
text/plain : 인코딩 없이 텍스트 그대로 전송. application/www-form-urlencoded : 기본값. 폼 데이터를 인코딩해서 전송. multipart/form-data : 첨부 파일이 있을 경우 사용 |
target |
_self : 현재 탭(창)으로 폼 데이터를 전송함. _blank : 새창/탭을 띄워 폼 데이터를 전송함. 아이프레임명 : 아이프레임으로 폼 데이터를 전송함. _parent: 부모 프레임으로 폼 데이터를 전송함. |