폼 조작 하기

폼 탐색하기

문서 내에 있는 모든 폼은 document.forms라는 기명 컬렉션(named collection)으로 관리됩니다.

  • 이름 접근: document.forms.myForm(<from name="myForm"> 기준)
  • 인덱스 접근: document.forms[0](문서 내 첫 번째 폼)

예제: 폼 데이터 간단 조회

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>폼 탐색 예제</title>
</head>
<body>
  <form name="userProfile">
    <input name="nickname" value="ProCoder">
    <input name="age" type="number" value="28">
  </form>
  <script>
    const profileForm = document.forms.userProfile;
    console.log(`닉네임: ${profileForm.nickname.value}`); // "ProCoder"
    console.log(`나이: ${profileForm.elements.age.value}`); // "28"
  </script>
</body>
</html>

폼의 요소는 form.nickname처럼 단축 표기법 또는 form.elements 컬렉션을 이용하여 접근할 수 있습니다.

fieldset 활용: 구조화된 폼 관리

폼은 <fieldset> 요소를 포함할 수 있으며, 폼 내 그룹화를 지원합니다. 그리고 fieldset도 독자적인 elements 컬렉션을 제공합니다. 즉, 폼 내부에 있는 fieldset을 통해서도 하위 요소에 접근할 수 있습니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Fieldset 탐색</title>
</head>
<body>
  <form name="paymentForm">
    <fieldset name="cardDetails">
      <legend>카드 정보</legend>
      <input name="cardNumber" value="1234-5678-9012-3456">
    </fieldset>
  </form>
  <script>
    const form = document.forms.paymentForm;
    const cardFieldset = form.elements.cardDetails;
    console.log(`카드 번호: ${cardFieldset.elements.cardNumber.value}`); // "1234-5678-9012-3456"
    console.log(`단축 접근: ${form.cardNumber.value}`); // 동일 결과
  </script>
</body>
</html>

단축 표기법 주의점

단축표기법(from.elementName)은 편리하지만, 요소의 name 속성을 동적으로 변경하면, 컬렉션의 접근 방식에 혼란이 생길 수 있습니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Name 변경 테스트</title>
</head>
<body>
  <form id="testForm">
    <input name="data" value="Initial">
  </form>
  <script>
    const form = document.getElementById('testForm');
    console.log(form.data.value); // "Initial"

    form.data.name = "newData";
    console.log(form.elements.data); // undefined
    console.log(form.elements.newData.value); // "Initial"
    console.log(form.data.value); // 여전히 "Initial" (캐시된 참조)
  </script>
</body>
</html>

역참조: element.from으로 상위 폼 접근

모든 폼 요소는 자신이 속한 폼을 element.form 프로퍼티를 통해 역참조할 수 있습니다. 이를 통해 요소와 폼 간의 양방향 참조가 가능해집니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>역참조 예제</title>
</head>
<body>
  <form name="feedback">
    <input name="comment" value="Great site!">
  </form>
  <script>
    const commentInput = document.forms.feedback.comment;
    const parentForm = commentInput.form;
    console.log(parentForm === document.forms.feedback); // true
  </script>
</body>
</html>

폼 요소 조작

입력 요소

  • 텍스트: input.value로 읽기/쓰기
  • 체크박스: input.checked로 상태 제어

셀렉트 요소

  • options: 모든 <options> 요소의 컬렉션
  • value: 현재 선택된 값
  • selectedIndex: 선택된 인덱스

예제: 단일 셀렉트 박스 조작

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>셀렉트 조작</title>
</head>
<body>
  <select id="langSelect">
    <option value="js">JavaScript</option>
    <option value="py">Python</option>
    <option value="java">Java</option>
  </select>
  <button onclick="changeLang()">Python으로 변경</button>
  <script>
    const langSelect = document.getElementById('langSelect');
    
    function changeLang() {
      langSelect.value = 'py';
      console.log(`선택된 값: ${langSelect.value}, 인덱스: ${langSelect.selectedIndex}`); // "py", 1
    }
  </script>
</body>
</html>

예제: 다중 셀렉트 박스 조작

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>다중 셀렉트</title>
</head>
<body>
  <select id="skills" multiple>
    <option value="html" selected>HTML</option>
    <option value="css">CSS</option>
    <option value="js" selected>JS</option>
  </select>
  <button onclick="logSelected()">선택된 값 보기</button>
  <script>
    const skills = document.getElementById('skills');
    
    function logSelected() {
      const selected = Array.from(skills.options)
        .filter(opt => opt.selected)
        .map(opt => opt.value);
      console.log(selected); // ["html", "js"]
    }
  </script>
</body>
</html>

Option 생성자로 동적 옵션 생성하기

JavaScript의 Option 생성자를 사용하면 동적으로 <option> 요소를 생성할 수 있습니다.

Option 생성자 문법

new Option(text, value, defaultSelected, selected);
  • text: 사용자에게 표시될 텍스트
  • value: 옵션의 값
  • defaultSelected: true이면 HTML 상에 selected 속성이 설정됨
  • selected: true이면 해당 옵션이 실제 선택 상태임
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>동적 옵션 추가</title>
</head>
<body>
  <select id="countries"></select>
  <button onclick="addCountry()">나라 추가</button>
  <script>
    const countries = document.getElementById('countries');
    
    function addCountry() {
      const newCountry = new Option("한국", "kr", false, true);
      countries.add(newCountry);
      console.log(`선택된 나라: ${countries.value}`); // "kr"
    }
  </script>
</body>
</html>