OVH Cloud OVH Cloud

[WebDev] [JAVASCRIPT] Contrôle numérique

7 réponses
Avatar
Roumegou
Pour les bons du JS ...
Pour un formulaire géré dynamiquement, je veux effectuer un contrôle
numérique. J'ai donc :
1 - dans mon formulaire, ma zone est décrite comme suit
<p><font size="2" face="Arial, Helvetica, sans-serif">Saisir un
nombre<br><input name="NBNIVO1" type="text"
onChange="CtrlNum(this,'Vous devez saisir un nombre')" value="0"
size="7" maxlength="5"></font></p>

avec ma fonction JS
function CtrlNum(objet,msgerr)
{
with (objet) // Pour l'objet en paramètre
{
valeur=parseInt(value);
if (isNaN(valeur)) // Si valeur n'est pas numérique
{
if (msgerr!="") {alert(msgerr);}
objet.select(); // Resélectionne le champ
objet.focus(); // Resélectionne le contenu
return false;
}
else
{
return true;
}
}
}

Cela est efficace si je saisis A dans la zone et cela m'envoie le msg,
mais pas si je saisis 12A.
Il se comporte comme s'il ne testait que le 1er car ??

J'ai essayé avec OnBlur à la place de OnChange mais c'est pareil.

Merci de vos réponses.

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)

7 réponses

Avatar
Romain PETIT
Roumegou avait prétendu :

Cela est efficace si je saisis A dans la zone et cela m'envoie le msg, mais
pas si je saisis 12A.
Il se comporte comme s'il ne testait que le 1er car ??
J'ai essayé avec OnBlur à la place de OnChange mais c'est pareil.



Avec les expressions régulières :
http://www.aidejavascript.com/article43.html

// contrôle d'une valeur numérique NNNNN ou NNNNN,NN NNNNN.NN
function controle_num(champ) {
if (champ.value == "")
return fonc_erreur("champ_vide", champ.name);
else if (!champ.value.match("^[0-9]*((.|,)[0-9]*)?$"))
return fonc_erreur("num_invalide", champ.name);
else return "";
}

--
Romain PETIT
http://cerbermail.com/?IJmancZl88
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Romain PETIT a émis l'idée suivante :
Roumegou avait prétendu :

Cela est efficace si je saisis A dans la zone et cela m'envoie le msg, mais
pas si je saisis 12A.
Il se comporte comme s'il ne testait que le 1er car ??
J'ai essayé avec OnBlur à la place de OnChange mais c'est pareil.



Avec les expressions régulières :
http://www.aidejavascript.com/article43.html

// contrôle d'une valeur numérique NNNNN ou NNNNN,NN NNNNN.NN
function controle_num(champ) {
if (champ.value == "")
return fonc_erreur("champ_vide", champ.name);
else if (!champ.value.match("^[0-9]*((.|,)[0-9]*)?$"))
return fonc_erreur("num_invalide", champ.name);
else return "";
}



Merci de ta réponse et du lien.
je viens de tester ta solution mais cela se comporte comme la mienne.
En fait, le pb vient du onChange je pense. Cela se comporte très
bizarrement. Il ne réagit pas tout le temps et il faut que le nombre de
caractères saisis soit différent du précédent pour passer dans cet
événement ???? (testé sous netscape et IE6)

PFFF!!! dire qu'on se plaint de windev mais je hais le javascript.

Bonjour la galère pour débugguer (je viens de passer l'am à apprendre à
utiliser venkman le deboggueur de JS de Mozilla)

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Pouvez vous m'éviter les hommes en blanc et la camisole car déjà les
voisins alertés par mes hurlements de bêtes ont commencer à appeler la
police !!!!

cela n'est pas un pb WebDev puisque j'ai isolé cela dans une page HTML
dont voici le source en fin de message.
Pouvez vous coller cela dans un fichier html et tester cela puis me
dire pourquoi cela ne fonctionne pas à tout les coups ???
essayez plusieurs valeurs et sortez du champs par tab. Par exemple le
jeu d'essai suivant :
a = rien
aa = msg OK
12 = rien
12p = rien
12pp = msg Ok


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Document sans titre</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<script language="JavaScript" type="text/JavaScript">
function CtrlNum(objet,msgerr)
{
debugger;
with (objet) // Pour l'objet en paramètre
{
if (!objet.value.match("^[0-9]*((.|,)[0-9]*)?$")) // Si
valeur n'est pas numérique
{
if (msgerr!="") {alert(msgerr);}
objet.select(); // Resélectionne le champ
objet.focus(); // Resélectionne le contenu
return false;
}
else
{
return true;
}
}
}
</script>

<body>
<form name=formulaire>
<p><font size="2"
face="Arial, Helvetica, sans-serif">Saisir un nombre<br>
<input name="NBNIVO1" type="text"
onChange="CtrlNum(this,'Vous devez saisir un nombre')" value="0"
size="7" maxlength="5"></font></p>
</form>
</body>
</html>

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Gégé
Roumegou wrote:
cela n'est pas un pb WebDev puisque j'ai isolé cela dans une page HTML
dont voici le source en fin de message.
Pouvez vous coller cela dans un fichier html et tester cela puis me dire
pourquoi cela ne fonctionne pas à tout les coups ???



Essaye ton Javascript sur plusieurs navigateurs.
Avatar
Roumegou
Gégé a formulé ce mardi :
Roumegou wrote:
cela n'est pas un pb WebDev puisque j'ai isolé cela dans une page HTML dont
voici le source en fin de message.
Pouvez vous coller cela dans un fichier html et tester cela puis me dire
pourquoi cela ne fonctionne pas à tout les coups ???



Essaye ton Javascript sur plusieurs navigateurs.



Netscape 7.0 et IE6 c'est déjà pas mal, non ?

En fait je viens de tester une version qui fonctionne. moins élégant
que les expressions régulières, mais cela fonctionne.
Et je ne comprends toujours pas pourquoi mes 2 premières versions ne
fonctionnent pas (expr régulière et if (isNaN(valeur))
function CtrlNum(objet,msgerr)
{
var RefString="1234567890";
var EstNum=true;
with (objet) // Pour l'objet en paramètre
{
InString=objet.value;
for (Count=0; Count < InString.length; Count++) {
TempChar= InString.substring (Count, Count+1);
if (RefString.indexOf (TempChar, 0)==-1)
{EstNumúlse;break;}
}

if (!EstNum) // Si valeur n'est pas numérique
{
if (msgerr!="") alert(msgerr);
objet.select(); // Resélectionne le champ
objet.focus(); // Resélectionne le contenu
return false;
}
else
return true;
}
}

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Roumegou avait soumis l'idée :
if (!objet.value.match("^[0-9]*((.|,)[0-9]*)?$"))


Comme quoi il ne faut pas toujours faire confiance aux sites de
developpement.


Voici ma version d'expression régulière et ça marche.
if (!objet.value.match("^[0-9]*(,|.)?[0-9]*$"))

sinon j'ai voulu remplacer [0-9] par d mais rien à faire. Pourtant
cela devrait fonctionner ??

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Gégé
Roumegou wrote:
if (!objet.value.match("^[0-9]*((.|,)[0-9]*)?$"))



Comme quoi il ne faut pas toujours faire confiance aux sites de
developpement.


Dépends desquels, perso j'utilise allhtml.com

Fais quand même attention à contrôler la saisie sur le serveur au final
car le client peut désactiver le Javascript.