Avant d'étudier un peu de JavaScript, il nous faut revenir au HTML, car des balises sont
dédiées à l'interaction avec l'utilisateur, notamment :
<form>, <input>
, <label>
,
<fieldset>
et <legend>
.
On parle d'interaction avec l'utilisateur lorsqu'il peut donner des ... données ( ! ) ( son nom, un nombre, son avis, ... ), choisir dans une liste, cocher des options, valider, ...
Le formulaire
<form>
La balise form crée une zone qui permet de créer un formulaire, c-à-d un ensemble de champs où l'utilisateur peut fournir des données et les envoyer à un serveur qui les traitera.
Un script est un bout de code, un tout petit programme. Le JavaScript est le langage le plus courant pour écrire des scripts en relation avec une page web.
Les formulaires sont très utiles. On retrouve les formulaires sur les pages d'accueil des moteurs de recherche, sur celles permettant de s'identifier sur un site, sur celles qui permettent d'envoyer une commande, ...
La balise form contient des zones dédiées au formulaire telles que des champs à remplir, des boutons ... mais aussi des balises classiques (paragraphes, des liens, ...)
Une page web peut contenir plusieurs formulaires.
<input /> et <label>
La balise input représente généralement un champ à remplir et parfois un bouton. Cette balise n'a pas de contenu ( pas de balise fermante ), mais de nombreux attributs. Les 8 attributs les plus importants ( parmi les 30 ! ) sont : type, placeholder, maxlength, size, required, readonly, value, pattern, ...
Plus d'info sur : http://www.w3schools.com/tags/tag_input.asp
attribut : type
L'attribut type permet de définir le type de champ, le type de données qu'il contiendra. Les 8 valeurs autorisées les plus importantes ( parmi les 23 valeurs de l'attribut type ) sont : text, number, email, url, password, submit, reset, ...
D'autres valeurs autorisées seront abordées prochainement : checkbox
, radio
,
hidden
, ...
Ainsi, que d'autres balises : select
, options
et
textarea
type="text"
"text" est la valeur la plus courante pour l'attribut type. La balise input représente alors un champ classique où l'utilisateur peut y taper n'importe quoi. Si l'attribut type n'est pas indiqué, le navigateur considérera que l'input est de type "text". Ce sont donc l'attribut et la valeur par défaut de la balise <input />.
Pour afficher le champ ci-dessus, il suffit de taper le code HTML suivant :
<form> <p> <input type="text" /> </p> </form>
On pourrait même taper <input />
, car le type par défaut est "text".
La balise input puisse exister en dehors de la balise form. Notamment lorsque la valeur du champ ne doit pas être envoyée à un serveur, mais utilisée dans une application web (monopage).
type="number", type="email", type="url"
Le type="text"
permet de taper n'importe quels caractères. Pour forcer
l'utilisateur à introduire de bonnes données, on peut préciser le type de données
attendu.
type="number", type="email", type="url"
force le navigateur à faire une
vérification avant l'envoi des données au serveur. Il affichera en rouge
le champ indiquant qu'il ne contient pas respectivement un nombre, une adresse e-mail ou
une adresse internet valide.
Combiné avec du code CSS, par exemple :
input:invalid{background-color: #FF8A8A}
input:valid{background-color: #99FFBB}
l'utilisateur peut alors voir - lors de la frappe - si sa donnée réussit le
pré-test (effectué par le navigateur).
<p> <label>Nombre 1 : <input type="number" required="required" /> </label> ... </p>
Au moment d'écrire ces lignes ( 18 janvier 2017 ),
-
Firefox 50
accepte la saisie de tout caractère
affiche les flèches haut et bas, à droite ( avant la saisie )
valide les nombres sans décimales ( avec virgule décimale tel que 5, )
ne valide pas les nombres sans décimales ( avec point décimal tel que 5. )
ne valide pas les nombre à exposant négatif, tel que 6e-10
-
Opera 42
n'accepte pas la saisie de lettres ( hormis le e )
affiche les flèches haut et bas, à droite ( lors de la saisie )
valide les nombres sans décimales ( avec virgule décimale )
ne valide pas les nombres sans décimales ( avec point décimal )
valide les nombres à exposant négatif -
Chrome 55
n'accepte pas la saisie de lettres ( hormis le e )
affiche les flèches haut et bas, à droite ( lors de la saisie )
valide les nombres sans décimales ( avec virgule décimale )
ne valide pas les nombres sans décimales ( avec point décimal )
valide les nombres à exposant négatif - IE 11
accepte la saisie de tout caractère
n'affiche pas à droite les flèches haut et bas
valide les nombres sans décimales ( avec virgule décimale )
valide les nombres sans décimales ( avec point décimal )
ne valide pas les nombres à exposant négatif - Edge 38
accepte la saisie de tout caractère
n'affiche pas à droite les flèches haut et bas
ne valide pas les nombres sans décimales ( avec virgule décimale )
valide les nombres sans décimales ( avec point décimal )
ne valide pas les nombres à exposant négatif
<p> <label>Nombre 1 : <input type="number" step="0.01" required="required" /> </label> ... </p>
Au moment d'écrire ces lignes ( 18 janvier 2017 ),
- Firefox 50
valide les nombres ayant une virgule décimale
ne valide pas les nombres ayant un point décimal
ne valide pas les nombres ayant plus de 2 décimales - Opera 42
valide les nombres ayant une virgule décimale
valide les nombres ayant un point décimal
ne valide pas les nombres ayant plus de 2 décimales - Chrome 55
valide les nombres ayant une virgule décimale
valide les nombres ayant un point décimal
ne valide pas les nombres ayant plus de 2 décimales - IE 11
ne valide pas les nombres ayant une virgule décimale
valide les nombres ayant un point décimal
ne valide pas les nombres ayant plus de 2 décimales - Edge 38
ne valide pas les nombres ayant une virgule décimale
valide les nombres ayant un point décimal
ne valide pas les nombres ayant plus de 2 décimales
<p> <label>Adresse e-mail : <input type="email" required="required" /> </label> ... </p>
Attention : la valeur de l'attribut est email.
Toutefois, en français, on parle d'adresse e-mail ( avec un trait
d'union ).
À noter que, pour parler d'un message électronique, il est recommandé de dire
courriel.
Rappel. En français, l'email est une couche de protection vitreuse utilisée en
céramique ...
L'adresse e-mail peut ne pas exister mais doit être bien formatée ...
N'oubliez pas qu'une adresse e-mail se termine par @ suivi d'un nom de domaine ...
Exemples de nom de domaine : google.fr, chocoloup.be, ...
<p> <label>URL : <input type="url" required="required" /> </label> ... </p>
Ces trois champs ressemblent au classique champ text. La différence est que les données vont subir un test de validation et ne seront envoyées que si elles sont valides.
NB : Le navigateur vous facilite la vie car, lorsque la valeur fournie est valide, il la retient pour vous la re-proposer dans d'autres champs du même type dans d'autres formulaires sur d'autres pages web. Il suffit de taper les premiers caractères et automatiquement une liste apparaîtra dans laquelle vous pourrez choisir la donnée appropriée. Cela vous évite de retaper votre adresse e-mail, rue, ...
type="password"
Ce type permet de remplacer chaque caractère par un caractère spécial pour empêcher ceux
qui regardent au-dessus de votre épaule de lire, par exemple, le mot de passe.
Selon le navigateur, ce caractère spécial peut être une étoile, un rond, ...
... <label>Mot de passe : <input type="password" value="0123" /> </label> ...
Attention. Le mot de passe sera envoyé en clair sur le réseau si le protocole utilisé n'est pas https ( avec "s" pour sécurité ).
type="range"
Ce type permet de sélectionner un nombre via un curseur.
... <label>Degré : <input type="range" min="0" max="360" value="180" onchange="document.getElementById('rangeValue').innerHTML=this.value;" /> </label> <output id="rangeValue"></output> ...
this représente l'élément lui-même. Cela évite d'ajouter l'attribut
id="range1" à la balise input, puis écrire :
document.getElementById('rangeValue').innerHTML=document.getElementById('range1').value;
type="submit", type="reset"
Ces deux types de champ sont des boutons !
Ce qui est affiché sur le bouton est la valeur de l'attribut value.
Les boutons ci-dessous ne feront rien. Il s'agit juste de les présenter ( et non de les utiliser )
<p> <input type="submit" value="Envoyer les données" /><br /> <input type="reset" value="Effacer les champs" /> </p>
Un clic sur le bouton "Envoyer les données" ( type="submit"
)
enverra les données ( à l'adresse indiquée dans la balise
form )
Un clic sur le bouton "Effacer les champs" ( type="reset"
)
effacera les données ( des champs contenus dans la balise form et
ré-affichera la valeur de l'attribut placeholder, si cet attribut
existe )
Ce qui est affiché sur un bouton ( type="submit"
ou de
type="reset"
) est la valeur de l'attribut
value.
Le bouton ci-dessous ne fera rien. Il s'agit juste de le présenter ( et non de l'utiliser )
<p> <input type="submit" value="Cliquez ici pour envoyer vos données" /> </p>
Si l'attribut value n'est pas utilisé, le navigateur affichera un nom par défaut en fonction du type de bouton ( submit ou reset ).
La balise label n'est pas liée à un bouton puis que le rôle du bouton est affiché sur le bouton.
attribut : placeholder
La valeur de l'attribut placeholder affiche, en filigrane, le genre d'information qu'on souhaite dans le champ.
<p> <label for="nom1">NOM : <input type="text" placeholder="Votre NOM en majuscule" id="nom1" /> </label> </p>
Ce texte en filigrane ne sera pas envoyé et disparaîtra dès la première frappe d'un caractère. Cela permet de se passer de la balise label. Cet attribut est particulièrement utile lorsque le formulaire est lu via un smartphone.
Cet attribut ne s'applique qu'aux champs modifiables.
attributs : minlength, maxlength
La valeur de l'attribut minlength définit le nombre minimum de caractères que devra contenir le champ.
La valeur de l'attribut maxlength définit le nombre maximum de caractères que pourra contenir le champ.
( max 4 caractères )
<p> <label for="pwd">Mot de passe : <input id="pwd" type="password" maxlength="4" /> ( max 4 caractères ) </label> </p>
Rappel : La valeur d'un attribut est toujours mise entre guillemets ( ou entre
apostrophes )
L'attribut maxlength n'est utilisable qu'avec les attributs : email,
password, search, tel, text ou url.
Cette vérification HTML (hors JS) est faite par le navigateur lors de la frappe, même si le champ n'est pas situé dans un formulaire.
attribut : size
La valeur de l'attribut size définit le nombre maximum de caractères visibles dans le champ. En pratique, cet attribut permet de définir la même taille à différents champs, pour des raisons esthétiques.
<p> <input type="text" size="1" /><br /> <input type="text" size="2" /><br /> <input type="text" size="3" /><br /> <input type="text" size="4" /><br /> <input type="text" size="5" /><br /> <input type="text" size="6" /> </p>
La valeur ="0" n'est pas autorisée et est alors ignorée ( => taille par
défaut )
Il existe une taille minimale.
Cependant, le bon usage veut que l'apparence se règle avec du code CSS tel que
.size{width:30px}
(dans un fichier CSS).
attribut : required
L'unique valeur de l'attribut required est "required" !
*
Contrairement au HTML, le XML requiert qu'à chaque attribut corresponde une valeur d'attribut. Autant prendre de bonnes habitudes et donc coder en XHTML.
<p> <label>Votre nom : <input type="text" required="required" /> <span class="obligatoire">*</span> </label> </p>
La vérification se fait avant l'envoi du formulaire.
La tradition veut qu'on place une astérisque rouge à coté d'un champ
obligatoire.
Cette astérisque rouge peut être codée en CSS. Par exemple :
input:required + label::after {content: " *";color: red; font-weight:
bold;}
attributs : min, max
Lorsque le champ est de type="number"
deux autres attributs sont disponibles
: min et max.
L'attribut min permet d'indiquer la valeur admise minimale
(incluse)
L'attribut max permet d'indiquer la valeur admise maximale (incluse)
*
<p> <label>Âge : <input type="number" required="required" min="18" max="120" /> <span class="obligatoire">*</span> </label> </p>
attribut : readonly
L'unique valeur de l'attribut readonly est "readonly" !
Cet attribut permet d'interdire à l'utilisateur d'y taper quoique ce soit. La valeur de
ce champ ne peut pas être modifiée par l'utilisateur, mais bien par un
script ...
Par exemple, pour afficher le résultat d'une opération.
<p> <label>Résultat de l'addition : <input type="text" readonly="readonly" value="12" /> </label> </p>
Ce fond gris peut être codée en CSS. Par exemple :
input[readonly] {background-color:DarkGrey;}
attribut : value
La valeur de l'attribut value est le contenu du champ. Il est ainsi possible de pré-remplir le formulaire. Cependant, l'utilisateur peut modifier cette valeur avant de valider le formulaire.
<p> <input type="text" value="12" placeholder="13 !" /> </p>
La valeur de l'attribut value est prioritaire sur celle de l'attribut placeholder.
attribut : name
Lorsque les données du formulaire sont envoyées à un serveur, ce sont les couples de valeurs des attributs name et value qui sont envoyées. L'attribut name est donc très important, (mais n'est plus utilisé qu'avec la balise input.)
Si l'attribut id est présent, comme la valeur de l'attribut name sert à identifier une valeur côté-serveur, par commodité, cette valeur correspond à celle de l'attribut id ( qui, pour rappel, est unique dans toute la page web )
attribut : autocomplete
Cet attribut ne prend que deux valeurs : "on" ou "off". Selon qu'on accepte ou non les suggestions du navigateur.
Le navigateur retient les valeurs tapées dans des champs semblables.
attribut : pattern
La valeur de l'attribut pattern est une expression
régulière.
La vérification aura lieu avant l'envoi des données.
... <p> <label>N° GSM : <input type="text" pattern="04[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}" placeholder="0499 01 23 45" title="04[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}" required="required" /> </label> <input type="submit" /> <input type="reset" /> </p> ...
Une expression régulière est une chaîne de caractères spéciale - qui contient des instructions - permettant de vérifier si une chaîne correspond à un modèle. Plus d'info
Pour tester une adresse e-mail mieux vaut utiliser type="email" qu'utiliser l'attribut pattern.
La valeur de l'attribut pattern peut être la valeur de l'attribut title. Ainsi, l'utilisateur verra le modèle auquel il doit se conformer.
<fieldset> et <legend>
<fieldset>
Comme vous l'avez remarqué, dans un formulaire, souvent les champs sont encadrés par un
liséré. Pour encadrer des champs, il suffit de placer la balise
<fieldset>
.
En anglais, field signifie champ
Et, set signifie ensemble
<legend>
Pour donner un titre à cet encadré, il suffit d'ajouter la balise
<legend>
(comme contenu de la balise <fieldset>
).
Le contenu de cette balise sera le titre de l'encadré.
<form onsubmit="alert('Merci !'); return false;"> <fieldset> <legend>numéro de GSM</legend> ... </fieldset> </form>
Formulaire : Exemple
Si les balises input ne sont pas placées dans la zone form, les boutons seront inactifs. Après un clic sur le bouton "Envoyer" rien ne sera envoyé. Et, après un clic sur le bouton "Effacer" rien ne sera effacé !
Sans attribut dans la balise form, après un clic sur le bouton
"Envoyer", le navigateur va bien vérifier certains champs et refuser l'envoi tant qu'ils
ne sont pas correctement remplis.
Et, s'ils sont tous remplis comme souhaité par le créateur du formulaire
( vous ), puisque vous n'avez pas précisé où envoyer ces données, le navigateur
choisit par défaut la page elle-même. Donc, il la réaffiche ( et les valeurs
contenues dans les champs sont effacées )
Pour modifier ce comportement, nous allons écrire un peu de JavaScript.
<form onsubmit="alert('Correctement rempli !'); return false;">
La valeur de l'attribut onsubmit dit au navigateur ce qu'il doit faire
lorsque l'utilisateur clique sur le bouton "Envoyer" ( = champ de
type="submit"
) et que les données sont valides.
Cette valeur contient du code JavaScript. Ce code contient deux instructions. La première
( alert('Correctement rempli !');
) affiche un message - une
"alerte" à l'attention de l'utilisateur -, la seconde ( return
false;
) annule l'envoi des données.
En JavaScript, les instructions sont toujours séparées par un point-virgule.
Maintenant, si le formulaire est correctement rempli, après un clic sur le bouton "Envoyer" s'affichera le message : "Correctement rempli !", puis après avoir confirmé la lecture du message ( via un clic sur OK ou sur la croix de fermeture de la boîte de dialogue ), les données ne seront pas envoyées ( et donc pas effacées par le réaffichage de la page )
Testez ce formulaire :
Voici le code complet :
<form onsubmit="alert('Correctement rempli !'); return false;"> <fieldset> <legend>Exemple de formulaire</legend> <p> <input type="text" id="Nom" size="35" required="required" placeholder="NOM" /> <span class="obligatoire">*</span><br /> <input type="text" id="Prenom" size="35" required="required" placeholder="Prénom" /> <span class="obligatoire">*</span><br /> <input type="email" id="Mail" size="35" required="required" placeholder="em@ail.com" /> <span class="obligatoire">*</span><br /> <input type="tel" id="Tél" size="35" required="required" placeholder="065/ ..." pattern="065/[0-9]{6}" title="065/[0-9]{6}" /> <span class="obligatoire">*</span><br /> <input type="text" id="Rue" size="35" placeholder="rue, n°" /><br /> <input type="text" id="CP" size="35" placeholder="CP = 4 chiffres" pattern="[0-9]{4}" title="[0-9]{4}" /><br /> <input type="text" id="Ville" size="35" placeholder="Localité" /> </p> <p> <input type="submit" value="Envoyer"> <input type="reset" value="Effacer"> </p> </fieldset> </form>
À la lecture de ce code HTML, on constate que des contraintes ont été mises.
- Les quatre premiers champs ne peuvent pas rester vide.
- Le troisième champ doit contenir une adresse e-mail dont le format est valide.
- Le quatrième champ doit contenir 065/ suivi de 6 chiffres.
- Le sixième champ peut être vide; mais, s'il ne l'est pas, il doit contenir 4 chiffres.
On constate alors que le navigateur fait des contrôles sans même taper une seule ligne de code JavaScript !
Voir : Validation JS
onsubmit="alert('Correctement rempli !'); return false;"
est du code JavaScript, mais il n'est ici que pour notre commodité.
Il peut être supprimé sans risque. Simplement, nous ne serons alors pas prévenu que les données sont valides. Seul le rafraîchissement de la page nous indiquera la réussite. Ce qui n'est pas explicite d'autant plus que le contenu des champs va être effacé. Ce code JavaScript ne fait que nous avertir ( alerter ) de la réussite de la vérification, sans envoyer les données ( et donc en restant dans la même situation qu'avant le clic )
Demain, on code !