Alain Barraud Mémento informatique  
 
Accueil Logithèque - SE Photo - vidéo Internet - protocoles Site Web PC - Réseau Archives
Page ouverte le 07/06/2009

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.

alt 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.

Retour accueil JS


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     }

alt 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

alt 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émentcheckeddefaultcheckeddisabledmaxlengthreadonlysizevaluedefaultvalue
Bouton*nonnonouinonnonnonouinon
Case*ouiouiouinonnonnonouinon
Hiddennonnonnonnonnonnonouinon
Selectnonnonnonnonnonouinonnon
Texte*nonnonouiouiouiouiouioui
Textareanonnonouinonouinonouioui

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émentfocusblurclickselect
Bouton*ouiouiouinon
Case*ouiouiouinon
Selectouiouinonnon
Textareaouiouinonoui
Texte*ouiouinonoui

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émentonFocusonBluronChangeonSelect
Bouton*ouiouinonnon
Case*ouiouiouinon
Selectouiouiouinon
Textareaouiouiouioui
Texte*ouiouiouioui

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.

alt 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.
question 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.
alt 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     }

alt 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.