Form Handling

One of the most common and undesirable tasks a user must do on the web is completing a form. Fortunately, JavaScript can make working with web forms more pleasant and enjoyable.

Add an Event Listener to a Form

Like with other HTML elements, an event listener can be added to a form using the addEventListener() method. For forms, the event type would be 'submit'.

const $form = document.getElementById('form')
$form.addEventListener('submit', function (e) {})

Prevent Page Refresh

By default, an HTML form will cause a page refresh when the form is submitted. This will also cause the JavaScript to be reset as well. Therefore, it is common to use the preventDefault() method on the event object.

const $form = document.getElementById('form')
$form.addEventListener('submit', function (e) {
  e.preventDefault()
})

Retrieve Form Elements

While it is possible to retrieve each form element individually, this can be tedious and time-consuming, especially on larger forms. Therefore, it is often more favorable to retrieve all of the form elements using the elements property. This property will return an HTMLFormControlsCollection, which is an array-like object.

A specific element can be retrieved using the element's name or id. A for...of loop could also be used to cycle through all the elements.

const $form = document.getElementById('form')
$form.addEventListener('submit', function (e) {
  e.preventDefault()

  const elements = $form.elements

  for (const element of elements) {
    console.log(element.name)
  }
})

Get an Element's Value

The main purpose of using JavaScript with a form is to retrieve the values to the form's elements. How to retrieve the value of an element will differ depending on the element's type.

Text boxes, text areas, and select boxes

For text boxes, including the type: text, number, email, or tel, text areas, or select boxes, the value property can be used.

<form id="form">
  <input type="text" name="color" value="blue">
  <textarea name="question">Why is the sky blue?</textarea>
  <select name="colors">
    <option value="red">red</option>
    <option value="blue" selected>blue</option>
    <option value="green">green</option>
  </select>
  <button type="submit">Submit</button>
</form>
const $form = document.getElementById('form')

$form.addEventListener('submit', function (e) {
  e.preventDefault()

  for (const element of $form.elements) {
    if (element.name) {
      console.log(element.name, element.value)
    }
  }
})

Radio buttons

For radio buttons, the RadioNodeList can be retrieved directly from the HTMLFormControlsCollection by using the name of the radio group as a key.

<form id="form">
  <label><input type="radio" name="color" value="red"> Red</label>
  <label><input type="radio" name="color" value="blue"> Blue</label>
</form>
const $form = document.getElementById('form')
$form.elements['color'] // RadioNodeList

Then, like the example above, the value property can be used with the RadioNodeList. This will return the value of the checked radio button.

NOTE

Using the value property on radio inputs in a loop will not provide the same result.

<form id="form">
  <label><input type="radio" name="color" value="red" checked> Red</label>
  <label><input type="radio" name="color" value="blue"> Blue</label>
</form>
const $form = document.getElementById('form')
$form.elements['color'].value // red