Accueil

Traduction

Tutoriel sur JS natif & Vue.js & jQuery.js & Node.js

Tutoriel JavaScript & jQuery - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Les formulaires HTML & JavaScript

Dans les exemples des chapitres précédents l'utilisateur communiquait avec le programme grâce à des fonctions natives : prompt(), confirm() & alert(). Ces boites de dialogue ne sont pas très ergonomiques.

Si JavaScript est un bon langage de programmation pour le Web il faut regretter que la gestion des entrées et sorties soit minimaliste ...

Heureusement dans HTML nous avons un outil formidable : le formulaire. Il est donc préférable de toujours confier les entrées-sorties à un formulaire HTML auquel sera associé un script.

Formulaires sans soumission

Je désigne par cette expression un formulaire qui se contente de gérer les entrées et sorties correspondant à un script.
Donc un formulaire utilisé pour éviter l'utilisation des boites de dialogue prompt(), confirm() & alert().

Dans ce type de formulaire les attributs method & action de la balise FORM sont inutiles. Par ailleurs l'élément button doit être de type "button" pour appeler une fonction JS sur clic.
En effet pour un élément button inclus dans le conteneur FORM le type par défaut est "submit" alors qu'en dehors d'un formulaire il est de type "button".

Premier exemple

Thème: l'utilisateur saisit un nom puis un prénom et, grâce à un script, la concaténation des deux est réalisée et affichée. Puis le focus est rendu au champ pour saisir le nom.

Il faut aussi un bouton de commande pour appeler le script (sur clic).
Il faut aussi des légendes pour aider l'utilisateur.

Le code CSS et HTML

Dans un formulaire on utilise surtout les balises input, label, button. Ces balises sont par défaut de type inline alors que la balise form est de type block. Or nous voulons avoir la légende (balise LABEL) du champ puis le champ de saisie (balise INPUT) alignés. Il faut donc que ces balises deviennent de type inline-block c'est à dire des boites qui se positionnent côté à côté tant qu'il y a de la place.
Ici chaque légende ou champ a une largeur interne de 45% de la largeur de la boite parente (FORM). Donc il y aura deux contrôles par ligne : l'élément LABEL et l'élément INPUT correspondant.
Astuce : notez une balise LABEL vide afin que le bouton de commande se positionne en dessous des champs de saisie.
Notez pour le troisième input l'attribut readonly. pour créer un champ en lecture seule et destiné à afficher le résultat du traitement.

Dans le code HTML, le formulaire, chaque INPUT et le bouton de commande disposent de l'attribut "name".

Précisez surtout le type "button" pour la balise button sinon le type par défaut est "submit" et le script ne sera alors pas exécuté.

Le script

Il est d'une simplicité déroutante !

Pour accéder en JavaScript, à un élément de formulaire, j'ai utilisé une vieille technique, mais toujours valide, reposant sur la syntaxe : nomFormulaire.nomChamp.propriété / méthode / événement.
Cela suppose que le formulaire et les contrôle du formulaire soient nommés.
Dans ce script j'ai utilisé la propriété value, l'évènement onclick et la méthode focus()
Notez aussi que la fonction n'est pas nommée : fonction anonyme.

Le rendu dans un Iframe

Deuxième exemple

Nous saisissons un nombre (entier ou décimal) dans un champ puis le carré ce nombre s'affiche dans un deuxième champ du formulaire.

Le code HTML

Le premier INPUT est de type "number" (nouveau type de champ introduit par la spécification HTML 5) donc on ne peut saisir dans ce champ qu'un nombre.
Tous les navigateurs récents ont implémenté le INPUT type number.
Sous Chrome on peut saisir dans ce champ un nombre décimal au format français (la virgule en tant que séparateur).

Le script

Le script ne présente aucune difficulté.

Le rendu dans un Iframe

Des applications en ligne HTML5 & JS

En combinant dans une même page du code HTML5, du CSS3 et du JS il est possible de réaliser des applications en ligne.
En lien deux applications qui peuvent vous être utiles :
-Calculette en ligne
-Boite à couleurs

Contrôle de saisie

Je vais maintenant évoquer l'emploi éventuel de JavaScript dans le cadre d'un formulaire de soumission c'est à dire un formulaire qui permet d'adresser des données en vue d'un traitement PHP, traitement qui modifie le plus souvent la base de données liée au site.
On reconnait un formulaire de soumission facilement ; les attributs action & method de la balise FORM deviennent obligatoires.

Dans ce type de formulaire avant toute tentative de soumission des données il faut procéder à un contrôle de saisie par le navigateur (ou contrôle de saisie côté client).

Vous êtes en droit de penser que grâce à toutes ces nouveautés apportées par HTML5 & CSS3 on peut parfaitement effectuer un contrôle de saisie par le navigateuér sans avoir à recourir à JavaScript.

En effet pour vérifier si un champ n'est pas vide ou si la saisie correspond à un certain gabarit vous n'avez plus besoin de JS ; il suffit d'utiliser les nouveaux types de INPUT (email, number,date) ou les nouveaux attributs required et pattern de la balise INPUT.
Mais si vous devez comparer la saisie dans deux champs différents, HTML ne vous est d'aucun secours puisque la notion de test n'existe pas dans ce langage ; il faut rajouter un script de contrôle.

La détection de l'évènement "soumission" peut alors se réaliser via HTML (attribut submit de la balise FORM) ou par le gestionnaire d'évènements de JS (formulaire.onsubmit = fonction()).

Première solution : pas de script !

Le code

Les données sont envoyées avec la méthode POST. En cas de succès de la soumission accès à la page "inscription_trait.htm" dans un nouvel onglet. En effet la balise form comprend l'attribut target="_blank". Cette page cible réserve quelques surprises ...
L'élément button doit être de type "submit". En effet si il est de type "button" il n'y aura pas de soumission possible. Par contre si le type n'est pas précisé, l'élément button dans un FORM est par défaut de type "submit" donc sera bien un bouton de soumission.

Le formulaire comprend quatre champs de saisie dont deux de type "email" et deux de type "password"
Les attributs name de chaque INPUT sont utiles dans le cadre du traitement PHP ; traitement qui ne sera pas évoqué dans ce chapitre.

Notez les pattern associés aux champs pour la saisie et confirmation du mot de passe.

D'après ce "pattern" seuls sont autorisés les lettres (majuscules et minuscules) non accentuées ainsi que les chiffres. Donc les lettres accentuées, les caractères de ponctuation, etc sont interdits.

On ne ne peut saisir plus de 8 caractères (attribut maxlength ="8").

Les quatre champs ne peuvent rester vide (attribut required).

Il y a donc de nombreux contrôles de saisie prévus par le code HTML5 et qui seront exécutés par le navigateur.

Tests

Bravo! vous accéder à la page "inscription_trait". Donc vous avez pu soumissionner avec succès.

On accède quand même à la page "inscription_trait" alors que les deux adresses mail sont différentes et les deux mots de passe sont également différents.
Vous découvrez à cette occasion les limites du contrôle via le HTML5.

Deuxième solution : avec un script

Grâce à JavaScript il sera possible de comparer les deux saisies de l'identifiant et les deux saisies du mot de passe.

Le code HTML

Le code HTML reste inchangé sauf pour la balise FORM ...

Le formulaire se nomme "f". Notez dans la balise FORM la valeur de l'attribut onsubmit : "return fenvoi()".
Avec cet attribut il y aura soumission seulement si les saisies correspondent aux gabarits et si la fonction fenvoi() retourne true.
On combine donc deux catégories de contrôles de saisie : par HTML et JS.

L'élément button n'a pas l'attribut "type"; Comme il est inclus dans un formulaire, il est donc par défaut de type "submit".
Notez aussi la balise titre H2 qui est vide ...

Le script associé au formulaire

Le script se contente de vérifier l'égalité entre les deux adresses mail d'une part et les deux mots de passe d'autre part. Il n'est pas nécessaire de vérifer le gabarit, la longueur de la chaine saisie puisque ces contrôles sont déjà effectués par HTML

Les noms des éléments sont utilisés dans le cadre du script et le seront aussi dans le cadre du traitement PHP. Donc dans le cadre d'un formulaire de soumission il est conseillé d'utiliser l'attribut "name" plutôt que l'attribut ID.

Si égalité entre identifiants et égalité entre mots de passe alors compteur vaut 2 ; La fonction retourne alors true.
Sinon la fonction retourne false et un message d'erreur est affiché dans la balise H2.

Test

Premier essai : saisir : toto.free - toto.free- abcd - abcd
Les mails et mots de passe sont égaux entre eux mais ne correspondent pas aux "pattern" donc soumission bloquée par HTML.

Deuxième essai : saisir : toto@free.fr - toti@free.fr - abcedefij -abcdefgh
Les mails et mots de passe correspondent aux patterns mais ne sont pas égaux entre eux donc soumission bloquée par le script (retourne false)

Troisième essai : saisir : toto@free.fr - toto@free.fr - abcedefg -abcdefg
Les saisies correspondent aux gabarits et sont égaux entre eux donc soumission effectuée avec succès.

Remarque importante

Un contrôle des saisies côté client ( par le navigateur) ne dispense d'une vérification côté serveur (en PHP au niveau de la page cible). En effet le JavaScript peut être désactivé par le navigateur. Par ailleurs utilisateur chevronné du Web peut accéder au code (via l'ongle "éléments" de la console) et supprimer pour sa session, les contrôles de saisie HTML. En d'autres termes tous les contrôles côté client peuvent être rendus inopérants !

Contrôle de saisie : autre solution

Il existe désormais une solution plus simple pour conditionner la soumission et plus conforme à la programmation JS moderne.
Plutôt que d'utiliser l'attribut onsubmit dans la balise FORM, utilisez le gestionnaire d'évènements de JS appelant une fonction anonyme. Et dans cette fonction, utilisez la méthode event.preventDefault(). Donc tout le JS est bien regroupé dans le script ; plus de "scories" de JS dans le code HTML !

Au sujet de la méthode event.preventDefault()

Par défaut lorsque vous cliquez sur un bouton de type "submit" du formulaire vous adressez les données saisies vers le fichier précisé dans l'attribut "action".
Naturellement cette soumission n'est envisageable que si tous les champs obligatoires sont remplis.
La méthode preventDefault() permet d'annuler le comportement par défaut. Donc dans le cadre d'un formulaire elle permet d'interdire le soumission en cas de saisie incorrecte.

Exemple

Formulaire d'inscription : nouvelle solution

Tant qu'il n'y a pas égalité entre les adresses mail et les mots de passe saisie, la soumission est bloquée.

Le code correspondant

Remarques concernant le code :

Code HTML : L'attribut "onsubmit ..." a disparu de la balise FORM. Les noms du formulaire et des champs sont identiques à la version précédente.
l'élément button doit être de type "submit".

Script : j'utilise à la place du gestionnaire d'évènements HTML, le gestionnaire d'événements de JS :
document.querySelector('form').onsubmit = function(event)
La méthode preventDefault(), rattachée à l'objet "event" neutralise l'action par défaut liée à l'élément).
Si le test retourne false la soumission est bloquée (annulation de l'action par défaut du formulaire) ; un message d'erreur est affiché dans la balise H2.

Afficher le mot de passe

Désormais sur beaucoup de sites et dans le cadre du formulaire de connexion, les caractères que vous saisissez dans un champ "mot de passe" peuvent être affichés si vous cliquez sur une icône.
Il suffit qu'un script transforme le type de ce champ : de "password" à "text" ou vice-versa.

Thématique : connextion à un site par identifiant et mot de passe.

Le code HTML

Une image représentant un oeil (facile à trouver sur la toile) est affichée à côté du champ de type "password".
Une légende est associée à l'image.
Si clic sur cette image appel : d'une fonction.

Le script

Il est d'un simplicité déroutante:

Si le champ "motdepasse" est de type "password" alors il devient de type "text".
Sinon c'est l'inverse.

Le rendu

Formulaire avec champs masqués

Le visiteur (du site) qui remplit un formulaire peut adresser à son insu des informations au site.
En effet un formulaire peut comprendre des champs masqués au visiteur. Ces champs doivent être remplis par l'attribut "value" ou par un script.

Thématique

En se connectant à son espace le visiteur communique à son insu la largeur et la hauteur de l'écran du terminal qu'il utilise.
Ainsi l'administrateur du site sait s'il a visité avec un ordinateur de bureau ou un PC portable ou une tablette ou un smartphone.

Le code HTML

Les données renseignées sont transmises à la page "cible.php" avec la méthode POST.
Remarquez les trois champs masqués (input type ="hidden") dont un seul a une "value" ...

Le script

Pour éviter le onsubmit="return nomfonction() dans la balise FORM, l'appel de la fonction se réalise dans le script :
document.querySelector('form').onsubmit = function()
Ce qui est beaucoup plus conforme au JS moderne.

La page "cible.php"

Le rendu

Les autres contrôles

Dans un formulaire il n'y a pas que des zones de texte (avec contenu visible ou masqué, monoligne ou multiligne).

Exemple

Dans l'exemple ci-desssous je vous montre comme traiter en JS mais aussi en PHP ces différents types de contrôles.

Le code HTML

Attention, le code HTML est conçu aussi pour un traitement PHP d'où l'instruction :
...form name ="f" action ="autres_controles.php" method ="post" ...
C'est en vue du traitement PHP que le groupe de cases cocher et la liste à choix multiples portent le nom d'un tableau de valeurs : jeux[] & sports[].
Ce nommage est obligatoire dans le cadre du traitement PHP.
Notez que toutes les cases à cocher bénéficient de la classe "cases" et tous les items de la liste à choix multiples sont affectés de la classe "multiple". Aucune mise en forme n'est associée à ces deux classes ; elles ont un rôle uniquement dans le cadre du script !

Le script

Pour ces quatre types d'entrées il faut manipuler les "value"
Pour un groupe de boutons radio et une liste à choix unique le traitement JS est simple puisqu'il n'y a qu'une seule valeur saisie (on ne peut cocher qu'un bouton et sélectionner un seul item de la liste).
Par contre pour un groupe de cases à cocher et une liste à choix multiple c'est un peu plus compliqué ...

En JS les noms jeux[] & sports[] ne sont pas valides ; on identifie donc le groupe (de cases et d'items) via une classe d'où les instructions :
var jeux = document.querySelectorAll('.cases') & var sports = document.querySelectorAll('.multiple')
Puis pour chaque groupe une boucle permet de concaténer dans une variable les "value" des cases "checked" OU les "value" des items "selected".

Cet exemple est intéressant car il montre qu'une classe CSS ne sert pas seulement à la mise en forme mais peut être utilisée pour un regroupement logique d'éléments du DOM.

Le rendu

Cliquez sur le bouton "traitement JS" après avoir renseigné correctement le formulaire, cliquez ensuite sur le bouton "traitement PHP".
Attention le resultat du traitement JS s'affiche sous le formulaire alors que le résultat du traitement PHP s'affiche dans une autre page.

Pour info je vous communique traitement PHP (contenu dans la page cible "autres_controles.php"). Traitement effectué en cas de soumission des données (clic sur le bouton de type "submit").

Mon tuto sur PHP et MYSQL