Calcul d'un panier + frais de port complexe

Résolu
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009 - 9 mai 2009 à 20:31
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009 - 10 mai 2009 à 17:33
Bonjour,


Avis à tous les amateurs, j'ai besoin d'un coup de pouce.

Je suis en train de réaliser la création d'un panier très simple.

J'ai qu'un seul produit, mais je ne suis pas familier avec js).

J'ai 3 offres de frais de port (classique, colissimo, et chronopost).

Seulement à partir de 2 produit les frais de ports changent pour chaque type d'envoi...


J'ai "bidouillé" un script mais forcément ça déconne un peu (Le total
ne fonctionne pas et ça ne marche que sous IE et pas FF). Je sens
pourtant que j'y suis presque. Peut-être existe-t'il une méthode plus
simple ?


Merci de vos lumières.


Voici un bout de la source.

<hr size="2" width="100%" />
<script type="text/javascript">
<!--
var porttotal = 3.95;
 
 
function calculerPrix(champQte){
var champPrix = champQte.form.elements[champQte.name + "prix"];
var champPrixUnite = champQte.form.elements[champQte.name + "unite"];
//var prixUnite = parseFloat(champPrixUnite.value);
var prixUnite = champPrixUnite.value;
var qte = champQte.value;
var champPort = f1.elements['port'];
var champPort1 = f1.elements['port1'];
var champPort2 = f1.elements['port2'];
var champPort3 = f1.elements['port3'];
if(qte "") qte 0;
elseif(isNaN(qte)) qte = 0;
else qte = Math.floor(qte);
if(qte < 0) qte = 0;

if(qte>=2) port1=0; else port1=3.95;
if(qte>=2) port2=2; else port2=5.95;
if(qte>=2) port3=9; else port3=12.95;

document.getElementById("port1").value=port1;
document.getElementById("port2").value=port2;
document.getElementById("port3").value=port3;
 
var prix = prixUnite * qte;
champPrix.value = formatPrix(prix);
calculerTotal(champQte.form);
}
 
 
function calculerTotal (form){
var champPort = form.elements['port'];
var champTotal = form.elements['total'];
//champPort.value = formatPrix(port);
 if(champPort 1){ porttotal port1; }if(champPort 2){ porttotal port2; }if(champPort 3){ porttotal port3; }

var total = 0;
for(var i in form.elements){
if(
//form.elements[i].name
i.toLowerCase().indexOf("prix") != -1)
total += parseFloat(form.elements[i].value);
}
//if (champPort == 1) { total += port1; }
//if (champPort == 2) { total += port2; }
//if (champPort == 3) { total += port3; }
total += porttotal;
champTotal.value = formatPrix(total);
}
 
function formatPrix (n){
n = Math.round(n*100)/100.0;
var
str = ""+n+"";
var i = str.indexOf(".");
if(i == -1) str += ".00";
elseif(i == str.length-2) str += "0";
return str;
}
 
// -->
</script>
<form name="f1">
\"5\" width=\"100%\">
----

----
Article</td>, Quantité</td>Prix par unité</td>, Prix selon
quantité</td></tr>
----

Article 1,
<select name="c1" onchange="calculerPrix(this);" >
<option value="1" onChange="calculerPrix(this);" selected>1</option>
<option value="2" onChange="calculerPrix(this);">2</option>
<option value="3" onChange="calculerPrix(this);">3</option>
<option value="4" onChange="calculerPrix(this);">4</option>
<option value="5" onChange="calculerPrix(this);">5</option>
</select>,
"text" size="5"name="c1unite" value="64"/></td>, \"text\"name=\"c1prix\" size=\"5\" value=\"64\"/></td>

<!------
Frais
de port</td>, &nbsp;</td>&nbsp;</td>, \"text\"name=\"port\" value=\"6.95\" size=\"5\"/> </td></tr>
 
----
TVA</td>, &nbsp;</td>&nbsp;</td>,
\"text\"name=\"tva\" value=\"0.00\" size=\"5\"/> </td></tr> -->
 
----

TOTAL TTC (hors frais de livraison)</td>, &nbsp;</td>&nbsp;</td>, \"text\"name=\"total\" value=\"64\" size=\"5\"/> </td></tr>
----

----

Mode de livraison,
"2">D&eacute;lai de livraison,
Prix,

----

name="port" type="radio" value="1" onClick="calculerPrix(this);" checked>
Livraison standard,
"2">5 &agrave; 10 jours ouvr&eacute;s,
"text"name="port1" value="3.95" size="5"/></td>

----, name=\"port\" type=\"radio\" value=\"2\" onClick=\"calculerPrix(this);\">
Livraison colissimo suivi </td>
"2">3 &agrave; 5 jours ouvr&eacute;s,
"text"name="port2" value="5.95" size="5"/></td>

----, name=\"port\" type=\"radio\" value=\"3\" onClick=\"calculerPrix(this);\">
Livraison Express Chronopost </td>
"2">2 jours ouvr&eacute;s,
"text"name="port3" value="12.95" size="5"/></td>

----

----, \"3\" height=\"15\">TOTAL TTC A REGLER</td>
<td>\"text\"name=\"totalfinal\" value=\"64\" size=\"5\"/></td>

 

</form>
 

8 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
10 mai 2009 à 11:06
Salut,

Pour la compatibilité IE/FF3 utilise des getElementById a la place des elements(qui est obsolete et que IE)

-->


De plus name n'est pas obligatoire dans ce cas.

Apres pour le reste si tu mettrais des commentaires et supprimerais les lignes
inutiles ca serait plus facile a lire.
3
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009
10 mai 2009 à 17:33
A nouveau moi.
Merci à vous.
J'ai résolu tous mes soucis, tout fonctionne. Pour l'erreur précédente c'était une histoire de parsefloat.
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
10 mai 2009 à 14:57
Bonjour,
quelques imprécisions pou FF,
que la console d'erreurs signale !!!!
....
var champPort = document.f1.elements['port'];    //¤¤¤¤¤¤¤¤     document
var champPort1 = document.f1.elements['port1'];    //¤¤¤¤¤¤¤¤
var champPort2 = document.f1.elements['port2'];    //¤¤¤¤¤¤¤¤
var champPort3 = document.f1.elements['port3'];    //¤¤¤¤¤¤¤¤
...
else if (isNaN(qte)) qte = 0;    //¤¤¤¤¤¤¤¤ else if pas elseif
...
else if(i == str.length-2) str += "0";    //¤¤¤¤¤¤¤¤
...
<!--    //¤¤¤¤¤¤¤¤-->
        id manquait , comme tu utilises document.gfetElementById
        idem pour port2, port 3
        IE substitue le name, pas FF

peut-être d'autres,
et sans préjuger des résultats !

Cordialement [mon Site] [M'écrire] Bul

Navigateurs |Quelques Explications |----
Chrome
, contrôler page actuelle / Options pour développeurs
/ Console Javascript, ----
FireFox
, Outils / Console d'erreurs
et mieux : télécharger FireBug, ----
Internet
Explorer
, activer le deboggage : Outils/options Internet/Avancés
dans la liste, sous "Navigation" : décocher
o Afficher une notification de chaque erreur de script
o Désactiver le débogage de Scripts (Internet Explorer)
et mieux (pour IE < 8) : télécharger le Debogger IE
voir aussi : DebugBar et Companion JS, ----
K-Meleon
, utils / Cons, ----
Opera
, utils / Asole d'erreurs, ----
Safari
, Debug / Show JavaScript Console
° modifier Fichier com.apple.Safari.plist situé dans le
répertoire : Support:\Documents and Settings\utilisateur
\Application Data\Apple Computer\Safari\Preferences\
y ajouter <key>IncludeDebugMenu</key>
----
0
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009
10 mai 2009 à 16:18
Merci les gars j'ai pas mal avancé grâce à vous.

J'ai un dernier petit souci maintenant.

J'ai un bouton radio "port" qui peut avoir les valeurs suivantes : 1, 2 ou 3.

J'aimerais que mon total soit calculé en fonction du bouton radio sélectionné.
Voilà ce que je fais mais ça ne prend pas.
Comment récupérer la valeur d'un bouton radio sélectionné ?
Merci infiniment.


function calculerTotal (form) {
var champPort = document.getElementById("port").value;
var champTotal = document.getElementById("total");
var champTotalFinal = document.getElementById("totalfinal");

var total = 0;
var totalfinal = 0;
for (var i in form.elements) {
if (
//form.elements[i].name
i.toLowerCase().indexOf("prix") != -1)
total += parseFloat(form.elements[i].value);
}
if (champPort 1) { totalfinal champTotal + document.getElementById("port1").value; }
if (champPort 2) { totalfinal champTotal + document.getElementById("port2").value; }
if (champPort 3) { totalfinal champTotal + document.getElementById("port3").value; }
//total += champPort;
champTotal.value = formatPrix(total);
document.getElementById("totalfinal").value = formatPrix(totalfinal);
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009
10 mai 2009 à 16:21
Désolé pour le message précédent je n'arrive pas à l'éditer et à le formater correctement...
0
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009
10 mai 2009 à 16:41
Je peux vous donner l'URL directement si vous voulez...
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
10 mai 2009 à 17:00
avant tout.... corrige les erreurs signalées.
0
cs_vitosss Messages postés 6 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 10 mai 2009
10 mai 2009 à 17:27
Hello,
Merci de ta réponse mais tout est corrigé.
Je suis proche de la fin !

Il me manque plus qu'à corriger cette erreur :
Dans le champ du résultat du calcul final il me met en résultat :
NaN.00
0
Rejoignez-nous