Empecher l'ecriture de chiffre négatif

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Empecher l'ecriture de chiffre négatif

par budiste » 14 mars 2006, 09:31

ok
merci beaucoup car je connais vraiment rien au javascript, et donc ce soir je me coucherais moins con

merci encore

par naholyr » 13 mars 2006, 18:27

Oké, alors je te décortique le fonctionnement ;)

A || B vaut A si A n'est pas faux (ou assimilé : null, undefined, NaN, 0, etc...), et B sinon.
parseInt(X) renvoie la valeur numérique de X, et s'il n'arrive pas à convertir, renvoie NaN.
Du coup parseInt(X) || 0 renvoie parseInt(X) s'il a réussi à convertir, et sinon (puisque NaN est considéré comme faux), la seconde valeur soit : 0.
On prend la valeur absolue de tout ça pour virer les négatifs : Math.abs(parseInt(X) || 0).

Pour avoir la chaine vide, premier reflexe : Math.abs(parseInt(X) || ""). Raté, dans le cas où la conversion échoue parseInt(X) || "" va valoir la chaîne vide, et Math.abs("") faisant une conversion implicite (pfiou), il renvoie... 0 !

Il faut donc décaler le Math.abs : Math.abs(parseInt(X)) || "".

Nouveau problème : si on entre 0, Math.abs(parseInt(0)) renvoie bien 0, pas de souci. Par contre 0 || "" renvoie la chaîne vide, puisque 0 est considéré comme faux. Ce qui interdit du coup de pouvoir mettre 0 dans le champ que l'on contrôle.

Il ne faut donc pas se contenter de vérifier si parseInt(X) est faux ou assimilé mais s'il est ou non NaN (Not a Number, valeur de retour des fonctions mathématiques quand on leur donne un paramètre non numérique et non convertible).

Donc

Code : Tout sélectionner

Si lireEntier(X) est un nombre : ValeurAbsolue(lireEntier(X)). Sinon : ChaineVide.
ce qui se traduit en Javascript avec l'opérateur ternaire :

Code : Tout sélectionner

!isNaN(parseInt(X)) ? Math.abs(parseInt(X)) : ''
champ.value = !isNaN(parseInt(champ.value)) ? Math.abs(parseInt(champ.value)) : '';

par budiste » 13 mars 2006, 18:07

j'ai mis || '' mais ca fais pareil qu'avec 0

par budiste » 13 mars 2006, 17:03

j'ai enlevé ||0 mais ca met NaN quand je mets un nombre negatif pouquoi
ca devrait pas me mettre la valeur absolue de ce nombre normalement ?


par contre si je met 90 et que j'essaie de mettre - devant c'est bon ca met 90

par budiste » 13 mars 2006, 17:01

ok, voila la fonction que j'utilise :
function forcePositif(champ) {
  champ.value = Math.abs(parseInt(champ.value) || 0);
}
Le nom de la fonction qui dois utiliser un champs : function forcePositif(champ) {

avec parseInt, on transforme bien la valeur du champs en nombre

avec Math.abs, on obtient la valeur absolue, donc un nombre positif forcément

|| c'est ou

donc je peux enlever || 0, non ?
je vais essayer

par naholyr » 13 mars 2006, 16:31

Je te laisse comprendre le script pour le modifier afin d'obtenir ce que tu souhaites ;)
C'est très facile, je préfère que tu comprennes ce que tu fais donc demande-moi ce que tu ne comprends pas dans le script.

par budiste » 13 mars 2006, 16:04

pardon en fait des que je met un - quand je teste il met aussitot un zero et il faut selectionner le zero pour ecrire un nombre positif

si j'efface le nombre present ca me automatiquement un zero

j'aimerais qu'il laisse un champs vide si c'est possible

par naholyr » 13 mars 2006, 15:43

Il faut que tu sois plus précis dans tes spécifications alors, soit tu ne veux que des nombres positifs, soit tu acceptes "nombres positifs ET espaces".

par budiste » 13 mars 2006, 15:10

merci
sinon est il possible de mettre autre chose que zero quand on est dans le input, un espace par exemple

par naholyr » 13 mars 2006, 13:14

Ceci permettra de forcer l'écriture de nombres uniquement, et positifs, dans le champ, en "temps réel" :
<input type="text" onkeyup="forcePositif(this)" onchange="forcePositif(this)">
function forcePositif(champ) {
  champ.value = Math.abs(parseInt(champ.value) || 0);
}
Ensuite pour une vérification dans le onsubmit :
<form onsubmit="return pasNegatif(this.elements['monChamp'])">
<input type="text" name="monChamp">
<input type="submit">
</form>
function pasNegatif(champ) {
  if (champ.value != parseInt(champ.value) || champ.value < 0) {
    alert("Vous devez entrer un nombre positif dans le champ "+champ.name);
    return false;
  }
  return true;
}
La deuxième vérification est inutile si tu as choisi la première. Puisque soit l'utilisateur désactive javascript et il met ce qu'il veut (aucune vérification ni dans un cas ni dans l'autre), soit il l'active et il ne pourra pas mettre autre chose qu'un nombre négatif dans le champ.

J'attire cependant ton attention sur un problème : désactiver JS étant facile dans certains navigateurs (je le fais souvent en cas de problème, F12, un clic et c'est fait - idem dans l'autre sens), il est donc INDISPENSABLE de vérifier les données dans ton script PHP.

par budiste » 13 mars 2006, 12:59

je voulais juste savoir si ca ressemblait a quelque chose, c'est evident que tu ne peux me tenir si ca marche mais deja si ca ressemble a quelque chose

sinon Webdevelopper c'est excellent je connaissais pas du tout
sinon il ne connait pas indice il dit

par Cyrano » 13 mars 2006, 12:52

Mais essaye-le : comment veux-tu que je sache si c'est bon ou pas: je n'ai pas ton code complet ni l'accès base de données nécessaire éventuellement, je ne peux rien tester. C'est à toi de le faire. Reviens si ça ne fonctionne pas avec les messages d'erreurs si tu en as.

par budiste » 13 mars 2006, 12:35

sinon ca te parait bon ce que j'ai fais ou pas ?

par Cyrano » 13 mars 2006, 12:22

Si il y a un problème avec le JavaScript, tu peux le voir dans la console JavaScript : si tu utilises Firefox, installe si ce n'est pas déjà fait la barre WebDevelopper : il y a une console JavaScript intégrée qui t'aidera à débugguer

par budiste » 13 mars 2006, 12:02

Comme ca c'est mieux ?
mais ca ne marche toujours pas, je pense avoir bien tenu compte de tes remarques la, mais je ne sais pas si mon javascript est bon
function pasdenegatif()
{
	var nb = document.forms['Formpanier'].elements[indice].value;
    for(var i = 1; i < nb; i++)
    {
        var quantid = 'quant'+ i;
        if ((document.getElementById(quantid).value)<0)
        {
            alert ('Vous ne pouvez pas mettre de quantité négative.');
            return false;
        }
    }
    return true;
}