JavaScript - Les formulaires
Dans le chapitre précédent, on a vu comment accéder aux différents éléments qui composent un formulaire.
Nous allons voir comment utiliser ces éléments afin d'éviter à l'utilisateur une overdose de boîtes de dialogue.
 |
Pour des raisons de clarté, le code HTML des formulaires est le plus concis possible.
Ainsi, des balises recommandées (notamment label) n'apparaissent pas. |
Sommaire partie 11
L'objet "form"
L'objet form, qui représente le formulaire lui-même : tous les éléments du formulaire en sont des sous-objets.
Deux évènements lui sont associés : onReset et onSubmit.
onSubmit
Cet évènement se produit lorsque le formulaire est envoyé. Il est particulièrement intéressant, car il va permettre de vérifier si les champs sont bien remplis avant d'envoyer le formulaire ; si ce n'est pas le cas, on pourra annuler l'envoi.
Rappel, l'envoi d'un formulaire en HTML se fait par un clic sur un élément
input
de
type submit
:
Code : HTML
1 <input type=
"submit" value=
"Envoyer" />
Il est possible de bloquer l'envoi d'un formulaire, et ce, de cette manière :
Code : HTML
1 <form method=
"post" action=
"page.php" onsubmit=
"return x;">
- Si x vaut true, le formulaire est envoyé normalement.
- En revanche, si x vaut false, alors le formulaire n'est pas envoyé (il ne se passe rien).
On va donc créer une fonction, nommée
verifier dans l'exemple qui suit, qui va vérifier le contenu du formulaire, pour éventuellement en bloquer l'envoi.
Code : HTML
1 <form method=
"post" action=
"page.php" onsubmit=
"return verifier(this);">
2 <!-- ici, le contenu du formulaire -->
3 <input type=
"submit" value=
"Envoyer" />
4 </form>
Et notre fonction ressemblera schématiquement à ceci :
Code : JavaScript
1 function verifier(f) {
2 if( /* le formulaire est bien rempli */ )
3 return true;
4 else
5 {
6 alert('Le formulaire est mal rempli');
7 return false;
8 }
9 }
 |
Vérifier le contenu d'un formulaire avec Javascript n'est pas vraiment fiable (JS peut être désactivé, volontairement ou non).
Seule une vérification des données côté serveur (avec PHP par exemple) est réellement efficace ! |
A ne pas faire !
Il est possible d'envoyer le formulaire directement en JS. Pour ce faire, il suffit d'exécuter la méthode submit()
du formulaire à envoyer.
Cependant, il faut toujours utiliser un bouton de type submit, sinon l'envoi du formulaire devient impossible pour quelqu'un ne disposant pas de JavaScript, ou l'ayant désactivé.
onReset
Le second évènement typique des formulaires se nomme
onReset, et est appelé lorsque le formulaire est remis à zéro par un bouton de type
reset
.
OnReset s'utilise assez facilement, de manière semblable à onSubmit :
Code : HTML
1 <form method=
"post" action=
"page.php" onreset=
"return confirm('Vraiment ?');">
Dans ce cas, si l'utilisateur veut réinitialiser le formulaire, il devra le confirmer. Si il confirme son action,
true est renvoyé, et le formulaire est alors réinitialisé ; s'il annule, c'est
false qui est retourné, et rien ne se passe.
Noter qu'on peut bien sûr exploiter à la fois
onSubmit et
onReset pour un même formulaire.
Les éléments, de A à Z !
Liste des attributs, méthodes et évènements typiques des différents éléments de formulaire.
Pour plus de clarté, certains éléments ont été regroupés dans une même catégorie (signalée par une astérisque). Voici les différents éléments et les catégories :
- Bouton*: regroupe les balises
<button>
ainsi que les <input />
de types button, reset et submit
- Case* : regroupe les
<input />
de types checkbox et radio
- Select : balise
<select>
- Textarea : balise
<textarea>
- Texte* : regroupe les
<input />
de types text, password et file (on ne s'attardera pas sur ce dernier)
Attributs
Attributs spécifiques aux formulaires
 |
On retrouve, comme avec les objets qui nous viennent du document, de nombreux attributs qui sont présents en HTML. |
Tous les éléments de formulaire possèdent ces attributs :
- form : le formulaire auquel appartient l'élément
- name : nom de l'objet (le fameux nom qui sert à désigner cet objet en JS)
- type : type de l'objet (button, select, textarea, ou l'attribut HTML
"type"
dans le cas d'un input
)
Certains éléments (cf. le tableau plus bas) possèdent ces attributs :
- checked et defaultchecked : valeur booléenne, true si la case est cochée (cochée par défaut dans le cas de
defaultchecked
), false sinon
- disabled : si cet attribut vaut true, l'objet est grisé (impossible à modifier / cliquer)
- maxlength : nombre de caractères maximal que peut contenir ce champ
- readonly : si cet attribut vaut true, l'utilisateur ne peut pas modifier le contenu du champ
- size : nombre de caractères / d'
options
qui sont affichés simultanément
- value et defaultvalue : valeur (valeur par défaut dans le cas de
defaultvalue
) de l'élément
Quelques éléments particuliers :
- textarea : rows et cols spécifient respectivement le nombre de lignes et de colonnes affichées
- select : multiple indique si on peut sélectionner plusieurs choix ou non ; options est un tableau contenant les
options
, qui sont au nombre de length ; et selectedindex est l'indice (dans le tableau d'options
) du choix sélectionné.
Quels attributs pour quels éléments
Se rajoutent les champs cachés (type hidden).
Elément | checked | defaultchecked | disabled | maxlength | readonly | size | value | defaultvalue |
Bouton* | non | non | oui | non | non | non | oui | non |
Case* | oui | oui | oui | non | non | non | oui | non |
Hidden | non | non | non | non | non | non | oui | non |
Select | non | non | non | non | non | oui | non | non |
Texte* | non | non | oui | oui | oui | oui | oui | oui |
Textarea | non | non | oui | non | oui | non | oui | oui |
L'objet option
Abordons séparément les attributs de l'objet
option
(ce sont les choix des menus déroulants
select
).
- disabled, form et value ont déjà été explicités plus haut
- index : indice du choix parmi le tableau
options
de l'élément select
- label : désigne le groupe auquel appartient ce choix
- selected et defaultselected : vaut true si ce choix est sélectionné / sélectionné par défaut
Méthodes
Méthodes spécifiques aux formulaires
- focus : donne le focus à cet élément (pour une zone de texte, place le curseur à l'intérieur)
- blur : enlève le focus de cet élément (en quelque sorte le contraire de
focus
)
- click : simule un clic de souris sur cet élément
- select : sélectionne ("surligne") le texte de ce champ
Quelles méthodes pour quels éléments
Elément | focus | blur | click | select |
Bouton* | oui | oui | oui | non |
Case* | oui | oui | oui | non |
Select | oui | oui | non | non |
Textarea | oui | oui | non | oui |
Texte* | oui | oui | non | oui |
Les évènements
Evènements spécifiques aux formulaires
- onFocus : lorsque l'élément reçoit le focus (pour une zone de texte, quand on place le curseur à l'intérieur)
- onBlur : lorsque l'élément perd le focus (en quelque sorte le contraire de
onFocus
)
- onChange : lorsque la valeur / l'état de l'élément change (quand on coche la case, qu'on modifie le texte, etc.)
- onSelect : lorsqu'on sélectionne (quand on "surligne") le texte de ce champ
Quels évènements pour quels éléments
Elément | onFocus | onBlur | onChange | onSelect |
Bouton* | oui | oui | non | non |
Case* | oui | oui | oui | non |
Select | oui | oui | oui | non |
Textarea | oui | oui | oui | oui |
Texte* | oui | oui | oui | oui |
Les éléments et leur fonctionnement
Les zones de texte
Lire et modifier leur contenu
On accède au contenu des champs textes (
input
de type
text ou
password, ainsi que
textarea
) à l'aide de l'attribut
value
, qu'on peut lire, mais aussi modifier.
Pour afficher la valeur du champ
pseudo du formulaire
monForm :
Code : JavaScript
1 alert("Vous avez saisi le pseudo : " + document.getElementById("idForm") .elements["pseudo"].value);
Voir :
-
test 13 avec code dans <body>
-
test 14 avec code function dans <head>
Si on veut modifier le contenu d'un
textarea
dont l'attribut
name
vaut
infos :
Code : JavaScript
1 document.getElementById("idForm") .elements["infos"].value = "Vous testez un script JS";
Voir :
-
test 13 avec code dans <body>
-
test 14 avec code function dans <head>
On peut ainsi récupérer et afficher des informations dans des champs de texte, ce qui est plus agréable et moins agressif qu'avec des boîtes de dialogues.
 |
Les trois balises HTML citées ci-dessus possèdent l'attribut booléen readonly, qui la rend non modifiable par l'utilisateur : on peut ainsi les utiliser pour afficher des messages. |
L'objet "select"
L'objet
select représente une liste déroulante, et comme dans toute liste, il peut être intéressant de savoir quel choix est sélectionné ; voyons comment procéder.
Prenons une liste dont le code HTML (qui se trouve à l'intérieur d'un formulaire) est le suivant :
Code : HTML
1 Vous êtes :
2 <select name=
"genre" onchange=
"VoirSelection(this)">
3 <option value=
"rien">Choisissez…</option>
4 <option value=
"garcon">Un garçon</option>
5 <option value=
"fille">Une fille</option>
6 <option value=
"saispas">Je ne sais pas</option>
7 </select>
On va ici utiliser l'évènement
onChange
, qui appellera la fonction quand l'utilisateur modifiera le choix.
 |
Comment récupérer la valeur de la sélection ? |
- Dans un premier temps, on va récupérer le numéro de l'option sélectionnée, grâce à l'attribut
selectedIndex
.
- Ensuite, il ne reste plus qu'à lire la valeur
value
de l'option correspondante, qui se trouve dans le tableau options
Code : JavaScript
1 function voirSelection(liste)
2 {
3 var numero = liste.selectedIndex;
4 var valeur = liste.options[numero].value;
5 alert("Vous avez choisi : " + valeur);
6 }
Bien entendu, il y a moyen de réduire ce code en faisant comme ceci :
1 var valeur = liste.options[liste.selectedIndex].value;
Il ne reste plus qu'à analyser le contenu de la variable
valeur
pour agir en conséquence, un peu comme ceci :
Code : JavaScript
1 function voirSelection(liste)
2 {
3 var valeur = liste.options[liste.selectedIndex].value;
4 if(valeur != 'rien')
5 {
6 if(valeur == 'saispas')
7 alert('Noob…');
8 else
9 alert(valeur);
10 }
11 }
Cases à cocher et boutons radio
Une seule case à cocher
La première utilisation des cases à cocher est d'en utiliser une seule (par exemple pour activer / désactiver un aperçu automatique).
Dans ce cas, on peut savoir si la case est cochée grâce à son attribut
checked
, qui est une valeur booléenne (il vaut soit
true
, soit
false
). On peut également la (dé)cocher, soit en modifiant la valeur de cet attribut, soit en appelant la méthode
click()
(qui simulera un clic de souris sur la case).
Par exemple, si on a une checkbox dont le nom est "maCase", dans un formulaire dont l'id est "idForm" :
Code : JavaScript
1 if(document.getElementById("idForm").maCase.checked)
2 alert("La case est cochee");
3 else
4 {
5 document.getElementById("idForm").maCase.checked = true;
6 alert("La case n'etait pas cochee, mais maintenant elle l'est");
7 }
Radio et groupe de checkboxes
Il est également possible d'utiliser les cases à cocher par groupe : dans ce cas, toutes les cases du groupe auront le même nom.
C'est également toujours le cas avec les boutons radio.
La technique pour y accéder est alors légèrement différente. Prenons le code suivant (on suppose que ces balises se trouvent dans un formulaire dont l'id est encore "idForm") :
Code : HTML
1 Vous aimez : <br />
2 <input type=
"checkbox" name=
"mesCases" value=
"pizza" /> la pizza <br />
3 <input type=
"checkbox" name=
"mesCases" value=
"tartiflette" /> la tartiflette <br />
4 <input type=
"checkbox" name=
"mesCases" value=
"ratatouille" /> la ratatouille <br />
5 <input type=
"button" value=
"Ok" onclick=
"afficherMessage()" />
Toutes ces cases possèdent le même nom ;
document.getElementById("idForm").mesCases
n'est donc pas
un objet, mais un
tableau d'objets. On va donc pouvoir accéder à la case numéro
i avec
document.getElementById("idForm").mesCases[i]
.
Code : JavaScript
1 function afficherMessage()
2 {
3 var monForm = document.getElementById("idForm");
4 var pizza =monForm.mesCases[0].checked;
5 var tartiflette = monForm.mesCases[1].checked;
6 var ratatouille = monForm.mesCases[2].checked;
7 if(tartiflette)
8 alert("Vous venez de la montagne, non ?");
9 if(ratatouille && !pizza)
10 alert("Vous preferez la ratatouille a la pizza ?!");
11 }
Avec ce script, on récupère l'état de chaque case (cochée ou non), et on affiche ensuite des messages selon les cases cochées.
 |
Bien entendu, on n'est pas obligé d'utiliser des variables pour enregistrer l'état de chaque case, on aurait pu écrire directement les document.monForm.mesCases[i] dans les if() .
Si tout est décomposé, c'est pour mieux visualisier la chose |
Il est à noter qu'on peut récupérer la valeur d'une case :
Toutes ces cases possèdent le même nom ;
document.getElementById("idForm").mesCases
n'est donc pas
un objet, mais un
tableau d'objets. On va donc pouvoir accéder à la case numéro
i avec
document.getElementById("idForm").mesCases[i]
.
Code : JavaScript
1 alert(document.getElementById("idForm").mesCases[0].value);
On peut également utiliser une boucle pour parcourir notre tableau de cases et savoir lesquelles sont cochées.
Et c'est d'ailleurs très intéressant dans le cas des boutons radio, car il ne peut y en avoir qu'un seul de coché parmi ceux ayant le même attribut
name.
Reprenons notre exemple précédent avec des boutons radios : "Vous préférez : […]".
Toutes ces cases possèdent le même nom ;
document.getElementById("idForm").mesCases
n'est donc pas
un objet, mais un
tableau d'objets. On va donc pouvoir accéder à la case numéro
i avec
document.getElementById("idForm").mesCases[i]
.
Code : JavaScript
1 function radio()
2 {
3 var cases = document.getElementById("idForm") .mesCases;
4 var platFavori;
5
6 // on recherche le bouton coche (s'il y en a un)
7 for(var i=0; i<cases.length; i++)
8 if(cases[i].checked)
9 platFavori = cases[i].value;
10
11 // s'il y en a un, on affiche la valeur correspondante
12 if(platFavori)
13 alert("Votre plat favori est : " + platFavori);
14 }
 |
On pourrait stopper la boucle précédente dès qu'on a trouvé un bouton sélectionné, étant donné qu'il ne peut pas y en avoir plusieurs.
Il suffirait pour cela de modifier la condition de boucle :
Code : JavaScript
1 for(var i=0; i<cases.length && !platFavori; i++)
|
L'intérêt de se baser sur l'attribut
value
, c'est qu'on peut rajouter des choix à notre formulaire sans avoir à toucher au code JS.
Pour s'entraîner, reprendre le script avec une boucle dans le cas des cases à cocher, et afficher la liste des plats que la personne aime.