Calcul dynamique

Fermé
Foo - 16 oct. 2007 à 05:26
 Jres - 18 oct. 2007 à 19:06
Bonjour,
bonjour!

J'ai un problème avec mon formulaire, j'aimerais qu'il calcul la totalité des quantités mais malheureusement il calcul seulement la première ligne lorsque l'utilisateur la change, les autres lignes sont ignorées. voici mon script

<SCRIPT language="javascript" >
function calcul(){
var mardi = 0 + Number(document.getElementById("mid[]").value);
var jeudi = 0 + Number(document.getElementById("jid[]").value);

var total = Number(mardi + jeudi);
document.getElementById("total").value = total;
}
</SCRIPT>

voici un peu plus loin mes inputs provenant d'une requête sql (une boucle)

print '<tr><input type="hidden" "name="id[]" value='.$id.'><td><input type="text" name="prenom[]" value='.$prenom.' size="14"> <input type="text" name="nom[]" value='.$nom.' size="14"><td>'.$adresse.', '.$ville.'<td><center><input type="text" name="mardipopote[]" id="mid[]" value="'.$mardipopote.'" onChange="calcul()" size="3"><td><center><input type="text" name="jeudipopote[]" id="jid[]" value="'.$jeudipopote.'" size="3" onChange="calcul()" >';
A voir également:

4 réponses

Bonjour,
Vous ne pouvez pas avoir plusieurs éléments ayant le même id (mid[]) sinon la fonction getElementById() ne renvoie que la première occurence.
Pour palier à ce problème, vous devez définir un compteur dans la boucle issue de la requête sql et faire dépendre les ids de ce compteur :
mid[]_<%=compteur%> par exemple.

Enfin pour récupérer les données, voici deux méthodes possibles :
1/ Utiliser la methode document.getElementByTagNames('INPUT') et tester si l'id commence par mid[] pour chacun des résultats obtenus
2/ Définir à la fin de la "boucle sql" une variable javascript : var nbtot = <%=compt%>;
Ce qui permet ensuite de parcourir les éléments avec une boucle for
for (var i =0; i < nbtot, i++) {
var elem = document.getElementById("mid[]" + i);
}
Cordialement,
Jres
0
Merci pour le coup de main,

j'ai fait les changements que vous avez mentionné mais maintenant il ne calcul plus rien et m'envois une erreur Object expected.

voici les changements apportés.

<SCRIPT language="javascript" >
function calcul(){
for (var i =0; i < nbtot, i++) {
var mardi = document.getElementById("mid[]_" + i);
var jeudi = document.getElementById("jid[]_" + i);
}

var total = Number(mardi + jeudi);
document.getElementById("total").value = total.toFixed(2);
}
</SCRIPT>

ET PLUS BAS

print '<tr><input type="hidden" "name="id[]" value='.$id.'><td><input type="text" name="prenom[]" value='.$prenom.' size="14"> <input type="text" name="nom[]" value='.$nom.' size="14"><td>'.$adresse.', '.$ville.'<td><center><input type="text" name="mardipopote[]" id="mid[]_<%=compteur%>" value="'.$mardipopote.'" onChange="calcul()" size="3"><td><center><input type="text" name="jeudipopote[]" id="jid[]_<%=compteur%>" value="'.$jeudipopote.'" size="3" onChange="calcul()" ><SCRIPT language="javascript" > var nbtot = <%=compt%>; </SCRIPT>';
$i++;
}
?>

Où est mon erreur?
0
J'ai changé mon code, curieusement lors que j'essais une alerte avec un array en particulier ça me sort la bonne valeur, mais dans une boucle j'ai toujours des erreus...


<SCRIPT language="javascript" >
function calcul(){
var myMardiArray=document.getElementsByName("mardipopote[]");
var myJeudiArray=document.getElementsByName("jeudipopote[]");

// ici tu déclare tes variable car tu ne peux les déclarer qu'une fois
var TotalMardi = 0;
var TotalJeudi = 0;

for (var i =0; i < myMardiArray.lenght, i++) {
TotalMardi = TotalMardi + myMardiArray[i].value;
TotalJeudi = TotalJeudi + myJeudiArray[i].value;
}

var total = TotalMardi + TotalJeudi ;
document.getElementByName("total").value = total.toFixed(2);
}
</SCRIPT>
0
Bonsoir,

Pour répondre au message 2, plusieurs remarques :
Il faut déclarer nbtot avant la fonction calcul() puis la mettre en jour en "bas de boucle".
Mardi et jeudi sont des elements, vous ne pouvez pas les sommer sans prendre leur value puis caster celles-ci en Number.

En ce qui concerne le message 3 en utilisant la methode getElementsByName :
Je ne vois pas d'incohérence mise à part le myMardiArray.lenght qui devrait être myMardiArray.length.
Quelles sont les erreurs rencontrées ? A vérifier peut être si le cast implicite de myMardiArray[i].value en Number est bien effectué.

Cordialement,
Jres
0