Le langage HTML fournit une interface permettant aux internautes de communiquer des informations au serveur web : les formulaires
Ils sont principalement utiles pour envoyer des données
(par la méthode POST du protocole HTTP) :
poster un commentaire, s'authentifier sur un site…
Mais ils permettent aussi de spécifier des paramètres pour une page : champ de recherche, contrôle de l'affichage du contenu (ordre, filtrage)…
Ils fonctionnent exactement de la même manière pour les deux usages : des widgets (éléments d'interface) permettent à l'internaute de choisir des valeurs pour des « variables » spécifiées dans le code
formOn peut mettre des éléments classiques à l'intérieur (comme du texte, des paragraphes, des div…), mais surtout des widgets
input,
qui donne des résultats très différents en fonction de son attribut type :
<form>
<input type="text" />
<input type="checkbox" />
<input type="radio" />
</form>
Les légendes des champs du formulaires doivent être placés dans des éléments label (étiquettes)
Les labels doivent être explicitement associés à leurs champs : extrêmement important pour l'accessibilité et pour l'ergonomie !
<form>
<label>Ville : <input type="text" /></label>
<label>Capitale : <input type="checkbox" /></label>
</form>
Si on ne veut ou ne peut pas mettre le champ dans le label,
on peut également donner un id
au champ et relier le label à ce champ en spécifiant son identifiant dans l'attribut
for du label.
Un formulaire est inutile si on ne peut pas le soumettre
button
<form>
<input type="text" value="Texte par défaut" />
<button type="submit">Envoyer !</button>
</form>
submit envoie les donnéesreset remet tous les champs du formulaire à leur valeur par défautbutton ne fait rien ! Utile pour les scripts côté clientLes données entrées sur les widgets servent à donner des valeurs à des variables
Il faut donner des noms à ces variables, pour que le serveur sache à quoi sert chaque donnée !
name pour cela
<form>
<input type="text" value="Caen" name="ville" />
<input type="text" value="France" name="pays" />
<input type="checkbox" name="coche" />
<button type="submit">Envoyer !</button>
</form>
Attention au comportement des checkbox
Ne pas confondre les attributs name et id…
Dans l'exemple précédent, cliquer sur le bouton recharge la même page, mais l'URL a changé car le navigateur a ajouté des paramètres d'URL, construits à partir des noms des widgets et des valeurs fournies par l'internaute
Pour renvoyer vers une autre page, il faut donner l'URL dans
l'attribut action de l'élément form
Dans cet exemple on renvoie vers une URL où le serveur fait tourner un script écrit dans le langage de programmation côté serveur PHP qui fait quelque chose avec les paramètres :
<form action="demo/recup.php">
<input type="text" value="Caen" name="ville" />
<input type="text" value="France" name="pays" />
<input type="checkbox" name="coche" />
<button type="submit">Envoyer !</button>
</form>
NB : une simple page HTML ne sait rien faire avec les paramètres d'URL, c'est le serveur qui va analyser les paramètres et modifier le HTML envoyé en fonction. La récupération et l'utilisation des données envoyées sortent largement du cadre du cours de HTML.
Les paramètres d'URL ne conviennent pas à toutes les situations
On a souvent besoin d'envoyer des données au serveur
Dans ce cas, on peut spécifier que le navigateur doit utiliser la
méthode POST de HTTP, en écrivant method="POST"
comme attribut de l'élément form (la valeur par défaut de method
est GET ⇒ construit une URL paramétrée)
<form action="demo/recup.php" method="POST">
<input type="text" value="Caen" name="ville" />
<input type="text" value="France" name="pays" />
<input type="checkbox" name="coche" />
<button type="submit">Envoyer !</button>
</form>
Encore une fois, la récupération des données côté serveur sort largement du cadre du cours. Cependant il est bon de comprendre dès maintenant la différence d'utilisation entre les deux méthodes.
Si hésitation entre paramètres d'URL et méthode POST, se demander si l'URL paramétrée aurait un sens en tant que lien. Il n'est envisageable d'utiliser la méthode GET que si la réponse est oui.
POST ne sont pas affichées par les navigateurs, mais elles ne sont pas cachées !
Ne pas penser que POST est plus sécurisé que GET
Les boutons radio n'ont d'intérêt qu'en groupe : un seul peut être sélectionné
C'est l'attribut name qui les groupe
value
<form action="demo/recup.php" method="POST">
Les formulaires HTML, vous êtes :
<label><input type="radio" value="oui" name="fan" /> Fan</label>
<label><input type="radio" value="non" name="fan" /> Pas fan</label>
<label><input type="radio" value="?" name="fan" /> NSPP</label>
<button type=submit>Envoyer !</button>
</form>
L'élément fieldset permet de grouper des champs qui ont un rapport logique
entre eux
et de leur associer un label commun avec legend
<form action="demo/recup.php" method="POST">
<fieldset>
<legend>Les formulaires HTML, vous êtes :</legend>
<label><input type="radio" value="oui" name="fan" /> Fan</label>
<label><input type="radio" value="non" name="fan" /> Pas fan</label>
<label><input type="radio" value="?" name="fan" /> NSPP</label>
</fieldset>
<button type=submit>Envoyer !</button>
</form>
textarea pour du texte sur plusieurs lignes
<form action="demo/recup.php" method="POST">
<textarea cols="30" rows="5" name="multi">Mettre du texte ici !</textarea>
<button type="submit">Go</button>
</form>
Propriété CSS resize pour que l'internaute puisse modifier la taille
(valeurs : horizontal, vertical, both)
Attention, contrairement à input,
textarea a une balise ouvrante et une balise fermante (le contenu
est utilisé comme valeur par défaut)
<form action="demo/recup.php" method="POST">
<input type="text" size="10" name="prenom" value="Prénom" />
<textarea cols="10" rows="5" name="comm">Votre commentaire…</textarea>
<button type="submit">Envoyer</button>
</form>
L'internaute doit effacer le contenu avant de taper
En règle générale, c'est plutôt une sorte de « mode d'emploi » qu'on voudrait
placeholder :
<form action="demo/recup.php" method="POST">
<input type="text" size="10" name="prenom" placeholder="Prénom" />
<textarea cols="10" rows="5" name="comm" placeholder="Votre commentaire…"></textarea>
<button type="submit">Envoyer</button>
</form>
Attention, les exemples ci-dessous sont simplifiés : dans la pratique, il ne faut jamais utiliser
un placeholder à la place d'un label !
Le formulaire doit être compréhensible sans le placeholder, qui n'est pas toujours affiché.
select, qui contient plusieurs éléments option
<form action="demo/recup.php" method="GET">
<select name="fruit">
<option>Fraise</option>
<option>Pomme</option>
<option>Raisin</option>
</select>
<button type="submit">Go</button>
</form>
La valeur du paramètre est le contenu de l'élément option sélectionné, ou le contenu de son attribut value s'il existe
optgroup
<form action="demo/recup.php" method="GET">
<select name="instrument">
<optgroup label="Bois">
<option value="clarinette">Clarinette (si♭)</option>
<option value="basson">Basson (ut)</option>
<option value="sax">Saxophone (mi♭)</option>
</optgroup>
<optgroup label="Cuivres">
<option value="trompette">Trompette (si♭)</option>
<option value="trombone">Trombone (ut)</option>
<option value="tuba">Tuba (fa)</option>
</optgroup>
</select>
<button type="submit">Go</button>
</form>
remarquer l'utilisation de value (on n'utilise
pas les noms « compliqués » des instruments dans le code)
Améliore aussi l'accessibilité
select
avec l'attribut booléen multiple
<form action="demo/recup.php" method="GET">
<select multiple name="fruit">
<option>Fraise</option> <option>Pomme</option>
</select>
<button type="submit">Go</button>
</form>
NB : attribut booléen = pas besoin de valeur, la simple présence de l'attribut lui donne la valeur « vrai »
<form action="demo/recup.php" method="GET">
<select multiple name="fruit[]">
<option>Fraise</option> <option>Pomme</option>
</select>
<button type="submit">Go</button>
</form>
Il existe un certain nombre de input différents, notamment
des variantes du champ text qui donnent plus de sémantique :
email, url, number…
Intérêt : éviter les erreurs de l'internaute (on ne peut pas soumettre le formulaire si les valeurs sont incohérentes) et augmenter l'ergonomie (par exemple les claviers proposés sur mobile peuvent être adaptés au champ)
Voir par exemple ce guide en français sur Alsacréations
Attribut target de l'élément form :
indique où sera affichée la réponse. _self pour la même fenêtre (ou iframe), _blank pour une nouvelle
Attribut booléen checked : permet qu'une case soit
cochée par défaut, ou qu'un bouton radio soit sélectionné par défaut.
Attribut booléen selected : idem, mais pour une option dans
un menu déroulant.
Attribut booléen disabled : valable pour tous les widgets, permet de les rendre non modifiables.
Attribut booléen required : valable pour tous les widgets, permet de les rendre obligatoires.
Voir le tutoriel sur MDN
pour d'autres compléments sur la validation des formulaires
(attributs HTML pattern, minlength et maxlength, min et max, etc., pour empêcher l'internaute de soumettre des valeurs aberrantes)
Tout n'est pas modifiable par CSS dans les formulaires, notamment les menus déroulants…
input :
utiliser les sélecteurs par attribut
input[type=text] {
border: 2px dotted green;
}
:focus, sélectionne les éléments qui ont le focus, très utile pour les champs texte:checked sélectionne les cases cochées, les boutons radio sélectionnés,
et les options choisies dans un menu déroulant (peut être détourné, un peu comme :target, pour rendre les pages un peu dynamiques !):default sélectionne les éléments qui sont dans leur état par défaut
(ex.: cases à cocher):valid et :invalid, pour styler les champs dont
la validation est correcte ou non:disabled et :enabled sélectionnent les éléments désactivés ou non
par l'attribut HTML disabled:required et :optional sélectionnent
les élements obligatoires ou non (attribut HTML required)Attention à width : les widgets ont chacun leur propre interprétation. Préciser box-sizing: border-box; pour être tranquille
Tous les détails sur le tutoriel de MDN