11550 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous

J'essaye de faire vérifier un formulaire avant l'envoi. Chaque champs doit vérifier la même expression régulière.
Je mets la même valeur dans tous les champs, mais le script m'en marque un sur 2 comme ayant une erreur. Pourtant, le pas à pas de Firebug semble passer à chaque fois sur la ligne qui marque le champs comme bon.
Voici mon code :


	$('form').submit (function () {
		var reg = new RegExp("^[1-9][0-9]*([\,\.]{1}[0-9]+)?$", "g");
		
		$("input.Required").removeClass('Erreur').addClass('OK');
		$("input.Required").each (function () {
			if (!reg.test ($(this).val ())) $(this).removeClass('OK').addClass('Erreur');
			else $(this).removeClass('Erreur').addClass('OK');
		});
		
		if ($(".Erreur").length) return false;
		else return true;
	});


Quelqu'un aurait une idée?
Merci d'avance
Modifié par NiKo2b (18 May 2011 - 11:10)
Salut,

C'est possible de voir le code HTML de ton formulaire ?
Sinon j'aurai trouvé la solution suivante un poil plus propre :
$('form').submit (function () { 
        var reg = new RegExp("^[1-9][0-9]*([\,\.]{1}[0-9]+)?$", "g"); 
         
        $("input.Required").each (function () { 
            if (!reg.test ($(this).val ())) $(this).addClass('Erreur'); 
            else $(this).addClass('OK'); 
        }); 
         
        if ($(".Erreur").length) return false; 
        else return true; 
    }); 


A plus ! Smiley smile
Merci pour la réponse.
En fait j'ai mis le removeClass et le addClass à la suite pour être sûr de ne pas avoir les 2 classes en même temps.

La ligne
$("input.Required").removeClass('Erreur').addClass('OK');
ne sert par contre à rien, effectivement.

Le code du formulaire est le suivant :

<form method="post" action="mon-compte/profils.html">
	<label for="m-1-1">Tour avant-bras  : </label>
	<input type="text" id="m-1-1" name="m-1-1" maxlength="8" size="3" class="Required Mensuration" />
	<label for="m-1-2">Tour poignet  : </label>
	<input type="text" id="m-1-2" name="m-1-2" maxlength="8" size="3" class="Required Mensuration" />
	<label for="m-1-3">Longueur du bras  : </label>
	<input type="text" id="m-1-3" name="m-1-3" maxlength="8" size="3" class="Required Mensuration" />
	...
	<input type="submit" value="Enregistrer" id="BoutonAjouter" />
</form>


Il y a une vingtaine de champs.
Et en essayant de faire un alert() de la valeur de chaque input ?
Tu as bien à chaque fois la même chose ?
Oui j'avais essayé et c'est toujours la même valeur.
Par contre si je mets partout une valeur qui ne vérifie pas l'expression, j'ai tous les champs marqués Erreur. Là c'est OK. Ce qui est d'autant plus bizarre...
Et en faisant un alert() de ta condition ? Tu as toujours la même valeur ou non ?
Autre question, tu as essayé sous plusieurs navigateurs ? Si oui, même résultats partout ?
En faisant un alert de la condition, j'ai l même chose pour tous les champs.
Et le problème est le même sur tous les navigateurs.

Une chose étrange par contre, c'est que pour un champs sur 2 la boucle passe 2 fois.
Par exemple, pour le premier le script marque directement le champs OK, pour le deuxième d'abord OK puis il y a un deuxième passage et là il marque Erreur. Pour le troisième ça reprend normalement et pour le quatrième même problème que le premier, etc.
Finalement, l'expression régulière ne servant qu'à vérifier si la valeur saisie est un nombre réel, je l'ai remplacée par isNaN() et là ça fonctionne.


$('form').submit (function () { 
        $("input.Required").removeClass('Erreur').addClass('OK');
        $("input.Required:[value='']").removeClass('OK').addClass('Erreur');
        $("input.Required").each (function () { 
            if (isNaN ($(this).val ())) $(this).removeClass('OK').addClass('Erreur'); 
        }); 
         
        if ($(".Erreur").length) return false; 
        else return true; 
    }); 


J'ai rajouté
$("input.Required:[value='']").removeClass('OK').addClass('Erreur');
pour vérifier d'abord si le champs est vide car le champs vide passe avec isNaN().

Du coup je n'ai pas l'explication de ce comportement bizarre mais au moins je peux avancer.

Merci encore pour ton aide
Hello,

Les objets RegExp contiennent un état mis à jour à chaque opération sur l'objet (test, exec, ...). Lorsque le flag "g" est présent, cet état est pris en compte et peut donner des résultat étonnants. Il suffit donc de l'enlever.

De plus, il NE FAUT PAS utiliser la construction "new RegExp" si cela n'est pas nécessaire (et cela est extrêmement rare). Préférer un littéral, plus clair (par exemple pour les échappements de caractères : dans ton code, les \ ne sont pas pris en compte), plus concis, plus efficace (le moteur JS peut "compiler" l'expression régulière) et dont les erreurs de syntaxe peuvent être facilement repérées par un outil d'analyse de code.
var reg = /^[1-9][0-9]*([,.]{1}[0-9]+)?$/;
Aïe! Je n'avais pas pensé aux valeurs négatives et "infinity".

J'ai remplacé la déclaration de l'expression régulière par celle que tu proposes et ça fonctionne.
Merci beaucoup!