📋 Le cours : saisir et envoyer des données
Un formulaire (<form>) permet à l'utilisateur de saisir des informations et de les envoyer à un serveur, ou de les traiter directement avec JavaScript. Les aperçus ci-dessus montrent chaque type de champ ; voici comment les assembler en un formulaire qui fonctionne.
Anatomie d'un formulaire
action est l'adresse qui reçoit les données, method la façon de les envoyer. Chaque champ a un name (la clé sous laquelle sa valeur est envoyée) et un id (utilisé pour le lier à son <label>). Un bouton type="submit" déclenche l'envoi.
<form action="/inscription" method="post">
<label for="prenom">Prénom</label>
<input id="prenom" name="prenom" type="text" required>
<label for="mail">E-mail</label>
<input id="mail" name="mail" type="email" required>
<button type="submit">S'inscrire</button>
</form>
Ce qui part vraiment : les attributs name
| Attribut | Rôle |
name | nom du paramètre envoyé au serveur : sans name, le champ n'est pas envoyé |
id | identifiant unique de la page : relie le champ à son <label for="…"> et sert au CSS / JavaScript |
value | valeur initiale du champ (ou valeur envoyée par une case / un bouton radio) |
GET ou POST ?
| GET | POST |
| où vont les données | dans l'adresse : page?q=python&niveau=2 | dans le corps de la requête, invisibles dans l'adresse |
| usage | recherche, filtre (on peut mettre la page en favori) | inscription, connexion, ajout ou modification de données |
| à retenir | jamais de mot de passe ni de donnée privée | pas de limite de taille pratique, pas mise en favori |
<form action="recherche.html" method="get">
<input type="search" name="q" value="python">
<select name="niveau">
<option value="2" selected>Niveau 2</option>
</select>
<button type="submit">Chercher</button>
</form>
Adresse après l'envoirecherche.html?q=python&niveau=2
Associer chaque champ à un label
<label for="prenom"> est relié au champ d'id="prenom" : cliquer sur le libellé place le curseur dans le champ, et un lecteur d'écran annonce le libellé quand on arrive sur le champ. On peut aussi entourer le champ par le label (<label>Prénom <input name="prenom"></label>), pratique pour les cases à cocher. Le placeholder est une indication grisée qui disparaît à la saisie : ce n'est pas un remplaçant du label.
Boutons radio, cases à cocher, listes, zones de texte
- Des boutons radio qui partagent le même
name forment un groupe : un seul choix possible.
- Des cases à cocher peuvent partager un
name : toutes les cases cochées sont envoyées.
<select> + <option value="…"> : liste déroulante ; <optgroup label="…"> regroupe des options ; multiple autorise plusieurs choix.
<textarea rows="4"> : texte sur plusieurs lignes (le contenu est écrit entre les balises).
<fieldset> + <legend> : regroupe des champs liés sous un titre, ce que les lecteurs d'écran annoncent.
<form>
<fieldset>
<legend>Niveau</legend>
<label><input type="radio" name="niveau" value="1" checked> Première</label>
<label><input type="radio" name="niveau" value="2"> Terminale</label>
</fieldset>
<fieldset>
<legend>Langages connus</legend>
<label><input type="checkbox" name="langage" value="python"> Python</label>
<label><input type="checkbox" name="langage" value="c"> C</label>
</fieldset>
<label for="specialite">Spécialité</label>
<select id="specialite" name="specialite">
<option value="">Choisir…</option>
<option value="nsi">NSI</option>
<option value="maths">Maths</option>
</select>
<label for="message">Message</label>
<textarea id="message" name="message" rows="4" cols="40"></textarea>
</form>
RenduUn cadre « Niveau » avec deux boutons ronds (Première coché), un cadre « Langages connus » avec deux cases, une liste déroulante « Spécialité » et une zone de texte de 4 lignes.
Valider avant l'envoi
HTML5 sait vérifier les saisies sans JavaScript : required (obligatoire), type="email" / type="number", min / max / step pour les nombres et les dates, minlength / maxlength pour la longueur, pattern (expression régulière) pour un format. Si un champ est invalide, le navigateur bloque l'envoi et affiche un message.
<form>
<label for="age">Âge (15 à 20)</label>
<input id="age" name="age" type="number" min="15" max="20" required>
<label for="pseudo">Pseudo (3 à 12 lettres)</label>
<input id="pseudo" name="pseudo" minlength="3" maxlength="12" pattern="[A-Za-z]+" required>
<button type="submit">Valider</button>
</form>
RenduSi l'âge vaut 30 ou si le pseudo contient un chiffre, le navigateur bloque l'envoi et signale le champ en cause.
La validation du navigateur n'est qu'un confort
N'importe qui peut contourner un formulaire (outils de développement, requête écrite à la main). Le serveur doit toujours revérifier ce qu'il reçoit : la validation côté navigateur ne protège rien.
Les boutons
| Code | Effet |
<button type="submit"> | envoie le formulaire (comportement par défaut d'un <button> dans un <form>) |
<button type="reset"> | remet tous les champs à leur valeur initiale |
<button type="button"> | ne fait rien tout seul : réservé à un script JavaScript |
Traiter le formulaire avec JavaScript
On écoute l'évènement submit et on appelle event.preventDefault() pour empêcher le rechargement de la page, puis on lit les valeurs avec .value. Les valeurs de champs sont toujours des textes : Number(…) convertit.
<form id="calcul">
<input id="nombre" type="number" value="5">
<button type="submit">Calculer le carré</button>
</form>
<p id="resultat"></p>
<script>
document.getElementById("calcul").addEventListener("submit", function (event) {
event.preventDefault(); // empêche l'envoi réel
const n = Number(document.getElementById("nombre").value);
document.getElementById("resultat").textContent = n * n;
});
</script>
RenduAu clic sur le bouton, « 25 » s'affiche sous le formulaire, sans recharger la page.
Voir le DOM en JavaScript pour sélectionner et modifier des éléments.
Attributs utiles
| Attribut | Effet |
placeholder | indication grisée dans un champ vide |
autofocus | place le curseur dans ce champ au chargement |
autocomplete="email" | aide le navigateur à préremplir (off pour désactiver) |
disabled | champ grisé, non modifiable, non envoyé |
readonly | non modifiable mais envoyé |
checked selected | case ou option cochée / choisie au départ |
multiple accept="image/*" | plusieurs choix / plusieurs fichiers ; types de fichiers acceptés |