Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
La spécification HTML5 introduit beaucoup de nouveautés pour les formulaires.
Je vous invite à revoir éventuellement la spécification HTML4 en matière de formulaire avant d'aborder toutes ces nouveautés.
Révisions HTML4 - les tableaux & les formulaires
CSS3 n'est pas en reste et propose de nouvelles pseudo-classes associées aux champs de saisie.
Vous aurez l'occasion de les découvrir en lisant cette page.
Le traitement JS est aussi amélioré ; la nouvelle méthode event.preventDefault() bloque la soumission des données
si celles-ci ne sont pas valides.
Ce formulaire permet de s'inscrire à un centre de vacances. Il s'agit donc d'un formulaire de soumission.
Le code inclut la plupart des nouveautés proposés par la version 5 de HTML et la version 3 de CSS relatives aux formulaires
Lorsque vous cliquez sur le bouton de soumission, les données sont envoyées vers la page cible seulement si les contrôles de
formulaire sont vérifiés.
Ces contrôles découlent de l'emploi des attributs required, pattern et de nouveaux types de champs (email, number, tel,etc.
Ainsi si un champ "required" est vide OU si un champ de type "number" contient du texte OU si un champ de type "email" ne contient
pas le caractère @ alors la soumission est bloquée.
La soumission est aussi bloquée si la saisie dans un champ ne correspond par au pattern (gabarit de saisie).
Ci-dessous, extrait de la feuille de style :
input:required {border : 2px solid red ; }
input:optional {border : 1px solid black ; }
input:invalid {color : red ;}
input:valid {color : green ; }
Pas de nouveautés par rapport à HTML4.
Comme il s'agit d'un formulaire de soumission les attributs action & method sont obligatoires.
Chaque attribut pattern a pour valeur une expression régulière.
Une expression régulière définit un gabarit de saisie. Si la saisie dans un champ "required" ne respecte pas ce gabarit la tentative de soumission échouera.
Notez que chaque expression régulière commence par ^ et se termine par $.
Ce qui signifie que le contenu du champ doit correspondre strictement à cette expression ni plus ni moins.
Ainsi si vous saisissez dans un des champs tel la chaine : "mon tel est 01 02 03 04 05", celle-ci passe au rouge,
le texte avant / après une suite de 14 chiffres, espaces et points n'est pas autorisée.
Mon propos sur les regExp est ici fort sommaire.
Pour en savoir davantage sur la construction des regExp : les regExp
HTML5 introduit de nouveaux types pour l'élément INPUT
Pour dessiner des boutons de commande dans un formulaire il est désormais conseillé d'utiliser la balise double button
plutôt que la balise simple input type ='button/reset/submit'.
Les types possibles de l'élément BUTTON sont : "submit" (soumission des données), "reset" (effacement des données)
et "button" (pour appeler une fonction JS).
Pour afficher un résultat dans le formulaire il est préférable d'utiliser l'élément output.
Voir un exemple à la fin de ce chapitre.
Ci-dessous un formulaire pour réserver un séjour dans un centre de vacances.
Remplissez le formulaire !
Tant que vous laissez des champs vides ou remplis avec des valeurs invalides, vous n'arrivez pas à soumissionner.
Tant qu'une saisie est incorrecte le texte est en rouge mais passe au vert dès qu'elle devient valide.
Dès que les saisies sont correctes vous accédez à la page cible : "form.saisie.php" ; en d'autres termes il y a soumission.
Réservez votre séjour !
Attention les contrôles de saisie via les attributs pattern & required ne sont actifs que s'il s'agit d'un formulaire de soumission, en d'autres termes si le bouton de soumission est de type "submit".
Je vous montre maintenant comment programmer un formulaire de soumission avec de surcroît un contrôle de saisie "côté client" efficace car comprennant des contrôles HTML et un script JS.
Objet du formulaire : inscription à un site coquin (créer son espace perso).
Ce document contient outre le code du formulaire HTML, un script et une feuille de style.
input:valid {color : lime;}
input:invalid {color : red;}
L'élément BUTTON est de type submit donc les contrôles de formulaire (via les attributs required & pattern) sont bloquants.
var message = document.querySelector('#message') ;
document.querySelector('form').onsubmit = function(event)
{
if (f.mail1.value == f.mail2.value && f.passe1.value == f.passe2.value)
{message.textContent = "Saisie correcte ! " ; }
else
{
event.preventDefault(); // annulation de la soumission
message.textContent = "Erreurs de saisie !" ;
}
} // fin fonction anonyme
Notez comment la fonction anonyme est appelée : document.querySelector('form').onsubmit : sur tentative de soumission du formulaire.
Remarquez l'utilisation de la méthode preventDefault() appliquée à un objet de type "event".
Donc si le test retourne false le comportement par défaut du formulaire (la soumission) est annulé.
Par contre si le test retourne true alors la soumission est effective.
Le nom de l'objet de type "event" est libre ; j'aurais pu utiliser "e" ou "evt" ou "evenement".
Faites des erreurs de saisie : deux adresses mail correctes mais différentes ET
deux mots de passe corrects mais différents.
Tous les champs passent au vert mais lorsque vous cliquez sur le bouton de soumission alors un message d'erreur s'affiche
et vous n'accédez pas à la page cible ("inscription_trait.php") donc la soumission est bloquée.
Saisissez enfin deux adresses mail correctes et identiques ainsi que deux mots de passe corrects et identiques..
Vous accédez alors à la page cible : "inscription_trait.php".
Le contrôle "côté client" ne dispense pas d'un contrôle de saisie "côté serveur" (via un script PHP ou Python).
En effet un visiteur averti peut contourner les contrôles "navigateur" ; il lui suffit d'accéder au code source de la page
et de supprimer les attributs required & pattern.
Dans mon tuto sur JavaScript, je consacre tout un chapitre
sur JavaScript et les formulaires
Vous découvrivrez de nombreuses astuces JS dans le cadre des formulaires.
Dans l'exemple qui suit je présente quelques nouveaux types de l'élément INPUT.
<form ... action ="#" ... : les données sont envoyéees dans la même page que celle contenant le formulaire.
Avec un champ de type "range" il est difficile de savoir la valeur saisie. il est conseillé de lui associer une balise OUTPUT qui affiche sous forme d'un texte la valeur saisie de le INPUT. Voir la fin de ce chapitre ...
Dans le champ de type "number", je peux saisir un décimal si l'attribut step est à "any".
Les champs de type "range" & "number" autorisent les attributs min & max & step.
Le champ de type "color" permet de sélectionner couleur à partir d'une palette. Cette palette se présente de façon différente selon les navigateurs.
Après une saisie correcte, les données soumissionnées apparaissent sous le formulaire par
exécution d'un script PHP.
Observez les données affichées par le script PHP (sous le formulaire) après la soumission.Saisissez :
C'est le code hexadécimal du rouge qui s'affiché : #ff0000 (ff en hexadécimal = 255).
Le traitement en PHP des données soumissionnées n'est pas évoquée dans ce tuto.
Vous trouverez dans mon site une initiation à ce langage.
traitement en PHP des données soumissionnées
La spécification HTML5 introduit une nouvelle balise double dans le cadre des formulaires : l'élément OUTPUT.
Cette balise peut se substituer à un input type ="text" readonly ... .
Déplacez les curseurs et observez ...
Remarquez la modification instantanée du total.
Il s'agit d'un formulaire simple (sans soumission).
Il y a trois balises OUTPUT.
Notez l'emploi de l'événement de formulaire onInput. Cet événement de formulaire se déclenche à chaque modification du contenu d'un élément INPUT ou TEXTAREA.
Le code ci-dessus utilise de nombreuses nouveautés HTML & JS mais est écrit à l'ancienne : emploi
des attributs évèmentiels HTML. Cette technique est à bannir car elle se traduit pas un "joyeux mélange" de HTML & JS dans le code
du formulaire. Ce code est difficile à lire donc à maintenir.
À la fin de chapitre je vous propose une réécriture de ce code avec une séparation stricte entre le HTML & le JS.
La saisie dans ce formulaire se fait via des input type range.
Pour ce type de champ il est difficile de lire la valeur ; aussi j'associe à chaque input range un OUTPUT pour afficher
clairement la valeur saisie.
Un troisième OUTPUT nommé "resultat" récupère le résultat de l'addition des valeurs des champs "range" :
form oninput="resultat.value=parseInt(premier.value)+ parseInt(deuxieme.value)"
Pour des champs de type number il est préférable d'informer visuellement l'utilisateur d'une saisie erronée.
Ce document HTML comprend un formulaire simple (pas de soumission).
Notez les deux règles de style, les sélecteurs sont construits avec les pseudo-classes :in-range & :out-of-range.
Via la molette il est impossible de saisir un décimal et un entier supérieur à 19.
Par contre via le clavier, il est possible de saisir un nombre supérieur à 19 entier ou décimal
d'où l'utilité des règles de style qui colorient le contenu des input number.
Là encore, grâce à l'événement de formulaire onInput un bouton de commande devient inutile.
Reprenons le thème du formulaire avec des éléments OUTPUT et sans bouton de commande.
Je vous montre ci-dessous comment écrire le code dans l'esprit du JS moderne.
Aucune "scorie" JS dans le code du formulaire.
Remarquez que le formulaire et les champs sont nommés.
Notez la balise H3 vide.
La détection des évènements se réalise avec la méthode addEventListener().
f1.addEventListener('input',function()
{f1.resultat.value=parseInt(f1.premier.value)+ parseInt(f1.deuxieme.value);});
f1.premier.addEventListener('change',function()
{f1.premier2.value = this.value;});
f1.deuxieme.addEventListener('change',function()
{f1.deuxieme2.value = this.value;});
message = document.querySelector('h3');
f1.addEventListener('input',function(event)
{message.innerHTML = "évènement : " + event.type; });
Quatre fonctions anonymes dont deux pour l'évènement input et pour cible le formulaire.
Comme les formules de calcul sont en dehors du formulaire, il faut utiliser dans celles-ci le nom complet de chaque champ :
nomFormulaire.nomChamp.
La méthode addEventListener() offre de nombreux avantages par rapport aux méthodes anciennes de détection.
Pour en savoir plus sur la gestion des évènements en JS