HTTP Forms
One of the earliest (and still widely used) mechanisms for transferring data from a browser (client) to the server is a form. The <form>
is a specific HTML element that contains input fields and buttons the user can interact with.
The <input>
Element
Perhaps the most important - and versatile - of these is the <input>
element. By setting its type
attribute, we can represent a wide range of possible inputs, as is demonstrated by this table taken from the MDN Web Docs:
Type | Description | Basic Examples | |
---|---|---|---|
button | A push button with no default behavior displaying the value of the value attribute, empty by default. |
| |
checkbox | A check box allowing single values to be selected/deselected. |
| |
color | A control for specifying a color; opening a color picker when active in supporting browsers. |
| |
date | A control for entering a date (year, month, and day, with no time). Opens a date picker or numeric wheels for year, month, day when active in supporting browsers. |
| |
datetime-local | A control for entering a date and time, with no time zone. Opens a date picker or numeric wheels for date- and time-components when active in supporting browsers. |
| |
A field for editing an email address. Looks like a text input, but has validation parameters and relevant keyboard in supporting browsers and devices with dynamic keyboards. |
| ||
file | A control that lets the user select a file. Use the accept attribute to define the types of files that the control can select. |
| |
hidden | A control that is not displayed but whose value is submitted to the server. There is an example in the last column, but it's hidden! |
| ā Itās here! |
image | A graphical submit button. Displays an image defined by the src attribute. The alt attribute displays if the image src is missing. |
| }}"/> |
number | A control for entering a number. Displays a spinner and adds default validation when supported. Displays a numeric keypad in some devices with dynamic keypads. |
| |
password | A single-line text field whose value is obscured. Will alert user if site is not secure. |
| |
radio | A radio button, allowing a single value to be selected out of multiple choices with the same name value. |
| |
range | A control for entering a number whose exact value is not important. Displays as a range widget defaulting to the middle value. Used in conjunction min and max to define the range of acceptable values. |
| |
reset | A button that resets the contents of the form to default values. Not recommended. |
| |
search | A single-line text field for entering search strings. Line-breaks are automatically removed from the input value. May include a delete icon in supporting browsers that can be used to clear the field. Displays a search icon instead of enter key on some devices with dynamic keypads. |
| |
submit | A button that submits the form. |
| |
tel | A control for entering a telephone number. Displays a telephone keypad in some devices with dynamic keypads. |
| |
text | The default value. A single-line text field. Line-breaks are automatically removed from the input value. |
| |
time | A control for entering a time value with no time zone. |
| |
url | A field for entering a URL. Looks like a text input, but has validation parameters and relevant keyboard in supporting browsers and devices with dynamic keyboards. |
|
Regardless of the type, the <input>
element also has a name
and value
property. The name
is similar to a variable name, in that it is used to identify the input’s value when we serialize the form (more about that later), and the value
is the value the input currently is (this starts as the value you specify in the HTML, but it changes when the user edits it).
Additionally, checkboxes and radio buttons have a boolean ischecked
property. These indicate if the box/button is checked or not (and that the box/button’s value
should be submitted).
The <textarea>
Element
The <textarea>
element represents a multi-line text input. Similar to terminal programs, this is represented by columns and rows, the numbers of which are set by the cols
and rows
attributes, respectively. Thus:
<textarea cols=40 rows=5></textarea>
Would look like:
As with inputs, a <textarea>
has a name
and value
attribute.
The <select>
Element
The <select>
element, along with <option>
and <optgroup>
make drop-down selection boxes. The <select>
takes a name attribute, while each <option>
provides a different value. The <options>
can further be nested in <optgroup>
s with their own labels. The <select>
also has a multiple
attribute (to allow selecting multiple options), and size
which determines how many options should be displayed at once (with scrolling if more are available).
For example:
<select id="dino-select">
<optgroup label="Theropods">
<option>Tyrannosaurus</option>
<option>Velociraptor</option>
<option>Deinonychus</option>
</optgroup>
<optgroup label="Sauropods">
<option>Diplodocus</option>
<option>Saltasaurus</option>
<option>Apatosaurus</option>
</optgroup>
</select>
Displays as:
The <label>
Element
A <label>
element represents a caption for an element in the form. It can be tied to a specific input using its for
attribute, by setting its value to the id
attribute of the associated input. This allows screen readers to identify the label as belonging to the input, and also allows browsers to give focus or activate the input element when the label is clicked.
For example, if you create a checkbox with a label:
<fieldset style="display:flex; align-items:center;">
<input type="checkbox" id="example"/>
<label for="example">Is Checked</label>
</fieldset>
Clicking the label will toggle the checkbox!
The <fieldset>
Element
The <fieldset>
element is used to group related form parts together, which can be captioned with a <legend>
. It also has a for
attribute which can be set to the id
of a form on the page to associate with, so that the fieldset will be serialized with the form (this is not necessary if the fieldset is inside the form). Setting the fieldset’s disabled
attribute will also disable all elements inside of it.
For example:
<fieldset>
<legend>Who is your favorite muppet?</legend>
<input type="radio" name="muppet" id="kermit">
<label for="kermit">Kermit</label>
</input>
<input type="radio" name="muppet" id="animal">
<label for="animal">Animal</label>
</input>
<input type="radio" name="muppet" id="piggy">
<label for="piggy">Miss Piggy</label>
</input>
<input type="radio" name="muppet" id="gonzo">
<label for="gonzo">Gonzo</label>
</input>
</fieldset>
Would render:
The <form>
Element
Finally, the <form>
element wraps around all the <input>
, <textarea>
, and <select>
elements, and gathers them along with any contained within associated <fieldset>
s to submit in a serialized form. This is done when an <input type="submit">
is clicked within the form, when the enter key is pressed and the form has focus, or by calling the submit()
method on the form with JavaScript.
There are a couple of special attributes we should know for the <form>
element:
action
- the URL this form should be submitted to. Defaults to the URL the form was served from.enctype
- the encoding strategy used, discussed in the next section. Possible values are:application/x-www-form-urlencoded
- the defaultmultipart/form-data
- must be used to submit filestext/plain
- useful for debugging
method
- the HTTP method to submit the form using, most often GET or POST
When the form is submitted, the form is serialized using the enctype
attribute and submitted using the HTTP method
to the URL specified by the action
attribute. Let’s take a deeper look at this process next.