form

Vérifier ses formulaires avec Jquery

Ce petit tuto a pour but de vous faciliter la vie quand vous tentez de valider vos formulaires en utilisant la technologie Javascript. A l’aide du framework Jquery et d’un de ses plugins nommé très simplement « formvalidation », vous gagnerez un temps considérable dans la gestion des erreurs de saisie.

 

Avant toute chose, je souhaite vous mettre en garde : Il est toujours possible pour un utilisateur de désactiver le Javascript, il n’est donc pas très judicieux de se baser sur ces données comme étant fiables. (Un petit script de vérification PHP est donc à rajouter, mais ce n’est pas l’objet du tuto). Le fait d’avoir une vérification Javascript permet dans un premier temps d’alléger la navigation du visiteur. En effet celui-ci ne sera pas obligé d’attendre une nouvelle requête vers le serveur, étant donné que tout la vérification s’effectue sur le poste du client.

Vous pouvez dés à présent, télécharger Jquery (J’utilise la version 1.2.6, ce plugin fonctionne probablement avec les versions inférieures mais contient quelques bugs sur la nouvelle version 1.3.1) et la première version du plugin FormValidation(1.1.1).

Création du document HTML

Créez un nouveau fichier HTML que vous nommerez formulaire.html avec ceci :

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
	<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
	<meta http-equiv="Content-language" content="fr-FR" />
	<title>Vérification de formulaire</title>
	<!-- IMPORT Feuilles de styles -->
	<link rel="stylesheet" type="text/css" href="feuilleDeStyle.css" media="all"/>
	<!-- IMPORT Javascript -->
	<script type="text/javascript" src="jquery-1.2.6.js"></script>
	<script type="text/javascript" src="jquery.formvalidation.js"></script>
  </head>
  <body>
	<form id="formulairecontact" method="post" action="formulaire.html" >
		<fieldset>
        		<legend>Formulaire de contact</legend>
        		<label for="nom">Nom</label>
        		<input type="text" name="nom" id="nom" value=""/>
        		<label  for="email">Email</label>
        		<input type="text" name="email" id="email" value=""/>
			<label  for="sujet">Sujet</label>
        		<select name="sujet" id="sujet">
        			<option>Séléctionnez votre choix</option>
				<option>Choix 1</option>
				<option>Choix 2</option>
				<option>Choix 3</option>
				<option>Choix 4</option>
				<option>Choix 5</option>
			</select>
        		<label for="message">Message</label>
        		<textarea rows="10" cols="25" name="message" id="message"></textarea>
        		<button>Envoyer</button>

                </fieldset>
           </form>
  </body>
</html>

Voilà, il s’agit juste d’HTML. je fais simplement un import des 2 fichiers Javascript Jquery et son plugin (attention à l’ordre) et d’une feuille de style que je retoucherais après. Mon formulaire est sinon assez banal avec pour chaque élément input, select, et textarea un attribut id et un attribut name. La balise

Faire appel au plugin

Pour faire appel à mon plugin et le relier à mon formulaire, nous avons juste à l’initialiser en reprenant l’Id du formulaire (ici « formulairecontact »). Voici comment procéder, recopiez ses lignes de code juste après l’importation du plugin FormValidation. Ces lignes seront éxécutées lorsque la page aura été complètement chargée dans le navigateur (et l’arbre DOM mis en mémoire).

<script type="text/javascript">
	$(document).ready(function(){
		$("#formulairecontact").formValidation({
			alias		: "name",
			required	: "accept",
			err_list	: true
		}); 

	});
</script>

Modifier le formulaire

Nous allons à présent modifier le formulaire et signaler en HTML quels sont les champs requis, le type de contenu attendu. Pour cela nous allons ajouter des attributs qui n’ont pas de signification en HTML (et rendront donc votre page invalide). Cependant ils vous faciliteront grandement la tâche lors de la création de vos formulaires…Les 3 attributs que nous allons utilisez sont les suivants:

  • required : (true ou false(par défault)) cet attribut informe si un champs doit être rempli. Tous nos champs seront en required= »true ».
  • mask : La valeur de cet attribut correspond au type de données que l’on attend (téléphone, mail, site, image, code postal…), la liste est définie dans le plugin (au tout début). Je vous conseil d’y aller jeter un oeil… vous pouvez bien évidemment créer aussi vos propres masques.
  • defval : attribut qui donne un renseignement sur la valeur par défaut du champ. La valeur finale doit donc être différente pour être validée (ex: ‘Tapez votre message ici’). Il est néanmoins essentiel d’attribuer la même variable à l’attribut value, sinon rien ne s’affichera.

Voici ce que cela peut donner:

<form id="formulairecontact" method="post" action="formulaire.html" >
		<fieldset>
        		<legend>Formulaire de contact</legend>
        		<label for="nom">Nom</label>
        		<input required="true" type="text" name="nom" id="nom" value=""/>
        		<label  for="email">Email</label>
        		<input type="text" mask="email" required="true" name="email" id="email" value=""/>
			<label  for="sujet">Sujet</label>
        		<select required="true" defval="Séléctionnez votre choix" name="sujet" id="sujet">
        			<option>Séléctionnez votre choix</option>
				<option>Choix 1</option>
				<option>Choix 2</option>
				<option>Choix 3</option>
				<option>Choix 4</option>
				<option>Choix 5</option>
			</select>
        		<label for="message">Message</label>
        		<textarea rows="10" cols="25" required="true" name="message" id="message"></textarea>
    		       <button>Envoyer</button>
                </fieldset>

</form>

J’avoue que le fait de rajouter des attributs inexistants dans un fichier qui plus est, est un document xHTML n’est pas sémantiquement très correct. Mais ça a le mérite de vous éviter quelques galères pour la validation de vos formulaires.

Un formulaire basique!

Enfin nous avons fini notre validation de formulaire (si si…). Je vous l’accorde c’est pour l’instant très moche. Il reste encore quelques choses à modifier et à ajouter (traduire le plugin, le styliser et annoncer les erreurs autrement que dans une popup…).

Amélioration du Plugin

Tout d’abord, il faut veiller à traduire le plugin. Voici les quelques lignes qui nous dérangent : ligne 97, 102, 103 et 104.

Ensuite nous allons faire en sorte que le message d’erreur ne s’affiche plus dans un vulgaire Alert ligne 117. L’idée est ici de remplir un paragraphe class= »error ». Initialement vide dans le code html comme ceci:

<legend>Formulaire de contact</legend>
<p class="error"><br /></p>
<p class="notice">Veuillez patienter</p>
<label for="nom">Nom</label>

Avec les propriétés CSS suivantes (dans le fichier feuilledestyle.css). D’ailleurs j’en profite pour styliser les champs du formulaire qui sont faux (Le plugin , lors de la validation change leurs attributs class à « invalidInput« ).

.invalidInput, .error{
        color:#8a1f11;
        background-color:#fbe3e4;
}
.error,.notice{
        padding:0.5em;
        margin:0.5em;
}
.error{
	border:2px solid #8a1f11;
	display:none;
}
.notice {
	background-color:#FFF6BF;
	color:#514721;
	border:2px solid #FFD324;
	display:none;
}

Reprenons maintenant notre plugin formValidation et réécrivons cette ligne 117 afin d’afficher le contenu des erreurs dans le paragraphe

.

Cela nous donne ce code, que vous pouvez remplacer par les lignes 116 et 117:

if (!frm && settings['display_alert']){
        $("form .error").html(settings['err_message'] + err_list);
		if ($("form .error").is(":hidden")){
                    $("form .error").slideDown("slow");
                }
        }
        else{
                if ($("form .notice").is(":hidden")){
                           $("form .notice").slideDown("slow");
                }
      }

Le code est assez parlant, si le formulaire contient des erreurs alors nous mettons notre variable avec les erreurs dans le paragraphe .error . S’il est en display:none; (par défault en CSS) Alors on l’affiche avec l’effet déroulant slideDown. Enfin s’il n’y a pas d’erreurs, on affiche le paragraphe qui indique à l’utilisateur de patienter (en attendant que la page se rafraîchisse). Comme vous pouvez le voir si vous avez testé ce code, les erreurs s’affichent sans retour à la ligne, ce qui n’est pas très élégant: Modifiez donc les lignes dans les fonctions required, mask et equal, lors de l’ajout de l’erreur à la variable err_list rajouter une balise
. Comme ceci par exemple pour la fonction required :

err_list += '<br />» "' + obj.attr(settings['alias']) + '" ' + err_msgs['required'] + '\n';

Voila le tuto semble se terminer. Il ne reste plus qu’à rendre le formulaire un peu plus agréable en CSS. Voici ma proposition (feuilledestyle.css):

.invalidInput, .error{
color:#8a1f11;
background-color:#fbe3e4;
}
.error,.notice{
padding:0.5em;
margin:0.5em;
}
.error{
	border:2px solid #8a1f11;
	display:none;
}
.notice {
	background-color:#FFF6BF;
	color:#514721;
	border:2px solid #FFD324;
	display:none;
}
form{
	width:500px;
	margin:auto;
	background-color:#e5e5e5;
	border-radius:1em; /*Trop cool pour IE :)  */
	-moz-border-radius:1em; /*Trop cool pour IE :)  */
}
form *{
	font-size:1.0em;
	font-family:georgia;/*on my mind!!*/
}
form fieldset{
	border:none;
}

form legend{
	font-size:2em;
	color:#777;
	margin-top:0.3em;
}
form label{
	display:block;
	float:left;
	width:150px;
	text-align:right;
}
form input, form select, form textarea{
	width:300px;
	margin-bottom: 1em;
	margin-left:0.5em;
}
form button{
	position:relative;
	left:160px;
}

Merci pour votre attention! Je suis preneur si vous pouvez améliorer mon CSS!

53 commentaires

S'abonner au RSS des commentaires
  1. Damocles
    Posté le 17/06/2009 à 14h09

    Bonjour à tous,

    je voulais savoir si il était possible d’utiliser formvalidation pour contrôler la saisie des champs input du type checkbox et radio ?

  2. François
    Posté le 11/06/2009 à 18h48

    oh je connaissais même pas l’attribut accept pour les formulaires, merci pour l’info.

    Sinon c’est un peu dommage d’écrire ta valeur dans le plugin directement (ca veut dire que tu ne pourras pas l’utiliser à un 2e endroit.
    Tu peux aussi plus simplement faire comme ca
    <select>
    <option selected="selected">ton choix</select>
    ca te le sélectionnera automatiquement.

  3. simply user
    Posté le 11/06/2009 à 16h36

    Je réponds à ma question smile

    L’attribut "Deval" peut être simplement supprimé en changeant une condition dans le Javascript.

    if ((obj.val() == ‘ ‘)||(obj.val() ==’Valeur défaut’))

  4. simply user
    Posté le 11/06/2009 à 16h12

    Tout d’abord, merci pour ta réponse rapide François.

    Je viens de changer l’attribut "mask=email" par "accept=email" dans le HTML et j’ai donc modifié le javascript en conséquence.
    Le code devient conforme pour la norme.

    Cependant il me reste le problème de l’attribut "deval".

  5. François
    Posté le 11/06/2009 à 14h38

    simply user -> Oui c’est le petit hic de ce plugin, tu pourrais par exemple mettre ces informations dans un attribut type class… class="required" ou class="mail required"… Mais là par contre il faudrait retoucher au javascript.

    David -> Oui je viens de voir ca, ca marche pas sur IE8 (ca met une erreur assez bizarre, je vais essayer de voir ce qui va pas). Sinon y’a un mode de rétrocompatibilité avec lequel ca marche s’il est activé… Qu’est ce qu’ils sont chiants chez Microsoft :s

  6. david
    Posté le 11/06/2009 à 14h23

    c’est moi ou le script ne fonctionne pas sous IE ?

  7. simply user
    Posté le 11/06/2009 à 12h49

    Bonjour,
    j’utilise ce tutoriel pour vérifier mon formulaire, cependant j’ai un problème.

    Les attributs "mask" et le "deval" dans les <input> ne sont pas validés par W3C et j’ai dans l’obligation que mon HTML soit valide pour la norme W3C hmm

    Quelqu’un connait il un moyen d’adapter le code ?

    Merci d’avance

  8. vectorSKIN
    Posté le 13/05/2009 à 10h52

    Sympa et facile à mettre en place, par contre cela ne fonctionne pas du tout sur Safari

  9. marjorie
    Posté le 13/05/2009 à 10h45

    Merci pour ces infos utiles !

  10. stefde10
    Posté le 02/05/2009 à 11h53

    ça y est j’ai compris d’où venait mon erreur…

    ça fonctionne nickel maintenant..

    cependant, j’aurai aimé savoir si il était pas possible de faire apparaitre la fenêtre des erreurs plutôt sur la droite de mon Formulaire et si possible, comment faire svp ?

    Cordialement,

    Stefde10

  11. stefde10
    Posté le 02/05/2009 à 11h16

    ça ne change absolument rien du tout malheureusement…

    de plus cet "ID" sort d’où exactement car je la retrouve nulle part.

    Désolé mais je suis ce qu’on pourrai appeler un noob en la matière hmm

  12. François
    Posté le 02/05/2009 à 3h08

    Tu as oublié l’identifiant sur ta balise form…
    Tchao

  13. stefde10
    Posté le 01/05/2009 à 21h42

    Bonjour,

    j’ai installé votre script sur mon site mais cela ne donne absolument rien côté vérification… mon Formulaire est valide à chaque fois et envoi le mail.

    Pourriez-vous m’indiquer la démarche à suivre pour régulariser ce problème svp ?

    Voici le lien concerné :

    http://www.weblobsdesigner.fr/quote.php

    D’avance merci,

    Cordialement,

    Stefde10

  14. Thomas
    Posté le 27/04/2009 à 10h55

    [citation][de]Réponse à Francois:[/de]Exact, j’ai découvert aussi ce petit soucis il y’a quelques jours![/citation]
    Bonjour, bravo pour ce tuto ! Petite remarque les email nom@domaine-domaine.org ne passe pas… Un problème dans le masque sans doute.

  15. kid
    Posté le 19/04/2009 à 0h03

    bonjour ,

    j’aimerais savoir ou doit-on placer notre adresse mail s.v.p

  16. ariden
    Posté le 15/04/2009 à 12h57

    Merci pour ce petit tuto smile

  17. Malonix
    Posté le 15/04/2009 à 9h23

    Pour la version de JQuery j’ai pris la version que tu avais mis dans tes sources pour être sur…

    Ensuite est ce que ca ne viendrait pas du framework symfony, comme je travail avec?

    Donc voila ce que tu as dis avec l’attribut ‘class’ m’a interpelé, donc j’ai regardé dans les souces, quand je charge la page, l’attribut est bien "class=nomAttribut", quand je charge avec au moins une erreur, l’attribut devient "class=nomAttribut InvalidInput"…

    donc voila j’espère pouvour régler un jour le problème.

  18. Francois
    Posté le 14/04/2009 à 16h15

    Tu as bien remplis le nom de tes champs dans l’attribut "class"??
    Sinon ouai ca peut venir de ta version de Jquery. J’en ai déjà parlé et ca fonctionne pas sur les versions supèrieures à 1.3, mais nickel pour la 1.2.6

  19. Malonix
    Posté le 14/04/2009 à 11h18

    $(document).ready(function(){
    $("#form_contact").formValidation({
    alias : "class",

    required : "accept",
    err_list : true
    });

    });

  20. Malonix
    Posté le 14/04/2009 à 11h17

    Donc voila j’ai bien mis err_list, je te transmets la déclaration du js.

    Euh est ce que ca peut venir de la version du JQuery?

  21. Francois
    Posté le 10/04/2009 à 17h43

    Euh quand tu initialises ton formulaire en Javascript,
    tu mets bien cette ligne:
    err_list : true
    Tu as peut etre mis ca:

    err_class : true

    Sinon je vois pas …Dis moi si ca marche pas…

  22. Malonix
    Posté le 10/04/2009 à 16h28

    Bonjour je suis en train de travailler avec ce tuto qui à mon gout est super bien fait, Bien joué l’auteur… Mais j’ai un petit problème, peut être que vous avez déjà eu… Donc en faite quand je valide la première fois mon formulaire les erreurs apparaissent bien, je remplis au hasard un champ obligatoire, et je re-valide et c’est là que viens le soucis : dans le message d’erreur, j’ai le nom du champ avec la chaine de caractère suivante "invalidInput". J’ai essayé d’enlever la varible(variable : err_class ) dans le js qui avait cette chaine de caractère, mais il enlève les couleurs des cadres (par exemple)… Donc voila si vous avez reussi à régler le problème ca serait gentil de partager xD

  23. Francois
    Posté le 03/04/2009 à 0h20

    Ca doit être un problème de CSS. vérifie que ton icone ne soit pas en display:block ou dans une div Sinon agrandit le width de ton formulaire (ou fieldset si tu en as un).

  24. Franck
    Posté le 02/04/2009 à 20h28

    Bonjour, j’essai d’utiliser jquery pour la validation d’un formulaire et j’ai un petit soucis de mise en forme.. je souhaiterai faire apparaitre l’image valide ou non à coté du champ du formulaire..actuellement il s’affiche en dessous et cela décale la mise en page du formulaire..
    si vous avez une petite solution à me proposer je suis preneur
    La prochaine fois j’appliquerai votre tuto mais la je suis bloqué

  25. Francois
    Posté le 25/03/2009 à 0h16

    Exact, j’ai découvert aussi ce petit soucis il y’a quelques jours!

  26. Damocles
    Posté le 24/03/2009 à 22h04

    J’ai noter une erreur relative aux emails.
    Le mask" email : /^([\w.])+\@(([\w])+\.)[a-zA-Z0-9]{2,}/,", ne permet pas de rentrer un email du type nom.prenom@domaine.com car dans la première partie de la regex certaines ponctuations comme le point ont étaient oubliées.
    Il faut donc remplacer le mask email :
    email: /^([a-zA-Z0-9_-])+\@(([\w])+\.)[a-zA-Z0-9]{2,}/,

  27. François
    Posté le 04/03/2009 à 12h15

    [citation][de]Réponse à Alas:[/de]J’ai essayer d’utiliser le script avec la version 1.3.1 de Jquery, et cela pose quelque bug. La vérification fonctionne correctement, c’est à dire que le message d’erreur s’affiche bien, mais le problème vient après, lorsqu’il faut corriger les erreurs les champs restent toujours en rouge et la validation ne se fait plus, donc impossible d’envoyer le form. En repassant avec la version de 1.2.6 de Jquery le script fonctionne bien.[/citation]

    Oui en effet, j’avais testé aussi avec 1.3, mais ca ne fonctionnait pas. En attendant une autre version du plugin, il n’y a pas d’autres alternatives…

  28. Alas
    Posté le 04/03/2009 à 12h09

    J’ai essayer d’utiliser le script avec la version 1.3.1 de Jquery, et cela pose quelque bug. La vérification fonctionne correctement, c’est à dire que le message d’erreur s’affiche bien, mais le problème vient après, lorsqu’il faut corriger les erreurs les champs restent toujours en rouge et la validation ne se fait plus, donc impossible d’envoyer le form. En repassant avec la version de 1.2.6 de Jquery le script fonctionne bien.

  29. François
    Posté le 18/02/2009 à 21h05

    T’utilises bien la version 1.2.6 de Jquery et la version 1.1.1 du plugin?
    Si je me souviens bien j’ai eu le même soucis, mais je sais qu’il y’a des petits bugs entre certaines versions…Et quand j’ai du faire la copie d’écran de l’alert je n’avais pas les bons fichiers surement…En tout cas ca ne peut être du qu’à ca…

    Sinon je répare ma petite erreur, merci!

  30. ThibZ
    Posté le 18/02/2009 à 17h36

    Je pense qu’il y a une petite erreur pour le fichier html, le label du sujet est appelé "email".

    Comme sur votre capture d’écran avec l’alert Javascript je n’ai pas réussi à demander une validation pour le textarea.
    En tout cas très bon tuto ! Ca marche super, excepté pour le textearea mais je dois me planté quelque part.

Laisser un commentaire

Votre e-mail ne sera jamais publié ni communiqué. Les champs obligatoires sont indiqués par *

*
*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>