Calcul de somme dans un formulaire

Signaler
Messages postés
4
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
9 août 2005
-
Bul3
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
-
Salut à tous,

Je suis plutôt néophyte en javascript, j'ai plutôt l'habitude du Cold Fusion ...

Voici mon problème.
Dans un formulaire, je génère 1 à X champs textes.
J'aimerais en fin de ce formulaire afficher le total des valeurs de ces x textes. (valeur en EUR, donc avec 2 décimales)

Idéalement, il faudrait que le calcul se fasse pendant qu'on tape, ou au pire en cliquant à côté (donc sans avoir à cliquer sur un bouton et avant de soumettre le formulaire)

Si l'un de vous vois comment faire, je suis preneur !

Merci

Laurent

8 réponses

Messages postés
103
Date d'inscription
lundi 10 mai 2004
Statut
Membre
Dernière intervention
10 mars 2010
7
Même sans maitriser le javascript, tu devrais savoir replacer les noms des variables de ton formulaire.

<script language="javascript">
function Somme() {
A=document.addit.case1.value;
B=document.addit.case2.value;
C=document.addit.case3.value;
document.addit.resultat.value=Number(A)+Number(B)+Number(C);
}
</script>

et

<form name="addit">

</form>

Pour l'arrondi à deux chiffres, il faudrait ajouter une variable intermédaire du style :

nb2=Number(A)+Number(B)+Number(C);
nb2=Math.round(nb2*100);
nb2=nb2/100;
document.addit.resultat.value=nb2;

et si tu ne connais pas le nombre de cases, alors une boucle avec un array dans la fonction.

bertrouf
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Oula, on dépoussière le post ....

PLEEEAASE HELP ...

C'est génial tout ça, mais est-ce qu'il est possible d'adapter la fonction "Somme" en fonction d'un nombre aléatoire d', nombre que je récupère dans une variable PHP suite à une requête dans une base.

Je connais très peu JS, trop peu ...
Par avance, merci
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
7
Bonjour,
oulah.. en effet ! 2004 ?
>>fonction "Somme" en fonction d'un nombre
>>aléatoire d',
oui, oui....
_ soit on met le même name
et on fait une ch'tiot boucle
for ( var n=0; n<document.name_formulaire.name_input.length; n++)
{ traitement de document.name_formulaire.name_input[n].value }
_ soit on met un id progressif ( du style id="inp1", id="inp2".. )
et on fait une ch'tiot boucle
var n=1;
while ( document.getElementById("inp"+n) )
{ traitement de document.getElementById("inp"+n).value 
  n++;
}
Cordialement
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Réaction < 10min ... Respect Total

Euuuhhhh ... c'est à dire que je débute en JS, faut pas te fâcher. lol

En fait, je construis un tableau avec une liste d'input dont le name est "valX" avec X allant de 1 au nb d'éléments dans le tableau :
$i=1;
do
   {
   if (isset($mon_tableau['element']))
      {
      echo '<tr>';
      echo '<td></td>';
      echo '</tr>';
      $i++;
      }
   } while ($mon_tableau = mysql_fetch_assoc(mysql_query($requête)));
[code=php]

Du coup, je pense m'orienter sur ta 2ème solution ... sauf que j'ai bien aucune idée de comment je peux faire pour incrémenter un nom de variable en fonction de mon nombre d'élément.

J'suis même pas sûr de bien récupérer mon nb d'enregistrement en JS tellement je débute.
Le NB d'enregistrement est une variable PHP (testé OK) et j'ai tapé le code suivant pour la récup sous JS :
[code=js]var nb_element=<?php echo $NB_element; ?>;
??


Pendant que j'y suis, autant de demander si tu peux pas me pondre un truc génial je te laisse plus de 10 minutes
Merci d'avance :)
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
7
bah... vous mettez un name qui varie
... name="val'.$i.'" ...
on peut faire mais j'aime pas ( navré )
( regarder getElementByName si vous tenez
à cette manière de faire )

je disais :
mettez le même name !
... name="val" ...
ou un id progressif !
... name="val" id="val'.$i'"'...

je ne vois pas que dire de plus...
vous donner un exemple ? ( pur js,
dans un tableau pour la présentation,
colonne de gauche pour les name,
celle de droite pour les ID,
sans aucune connotation politique,
vous adapterez et à votre php et
à quand il faut faire le cumul...
<form name="frm">
avec name,
avec id,
----
,
,
----
,
,
----
,
,
----
<hr />,
----
,


</form>
<script>

document.frm.res1.value=0;						// avec les name
for ( var n=0;n<document.frm.txt.length; n++ )
{	document.frm.res1.value=
Number(document.frm.res1.value)+
Number(document.frm.txt[n].value);	}

document.getElementById("res2").value=0;	// avec les id
n=1;
while ( document.getElementById("txt"+n) )
{	document.getElementById("res2").value=
Number(document.getElementById("res2").value)+
Number(document.getElementById("txt"+n).value);
n++;
}
</script>

Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
7
il fallait lire regarder getElementsByName
bien entendu, et ça ressemblera étrandement
à la manière de faire avec getElementById.
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
7
aller... exemple avec des name "progressifs"
cumul dans res3, name="txt1", "txt2"....
document.getElementsByName("res3")[0].value=0;
n=1;
while ( typeof document.getElementsByName("txt"+n)[0]!="undefined" )
{	document.getElementsByName("res3")[0].value=
Number(document.getElementsByName("res3")[0].value)+
Number(document.getElementsByName("txt"+n)[0].value);
n++;
}
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
7
ça ne convient pas si je comprend bien (?)
bah une autre possibilité :
sans utiliser ni name ni id :
var t=document.getElementsByTagName("TABLE")[0];
_ boucler grâce à t.rows.length
_ cumuler Number(t.rows[n].cells[n° col].firstChild.value)
pour d'autres pistes, je vais devoir réfléchir encore....