Calcul prix avec boutons radios

Résolu/Fermé
Paela318 Messages postés 17 Date d'inscription mardi 18 septembre 2012 Statut Membre Dernière intervention 11 mai 2013 - 10 mai 2013 à 22:32
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 - 11 mai 2013 à 00:18
Bonjour, je débute en JS et je dois faire un tp sur la vente de tableaux donc on doit pouvoir calculer le prix à partir de plusieurs critères, dans mon cas finition, support, format. Seulement, je ne sais pas comment récupérer les value des boutons radios cochés et calculer le prix du tableau en fonction des trois cochés :(
Voilà mon code, j'espère que vous arriverez à m'aider, je suis coincé dessus depuis plusieurs heures mais les seules réponses que je trouve, je ne les comprends pas :(
            <div id="choix">
                    <legend>1) Choix finition</legend>
                    <p><!-- Les radios -->
                        <input type="radio" name="finition" checked="checked" id="plexi" value="20"/> <label for="a">Plexiglas</label><br/>
                        <input type="radio" name="finition" id="alu" value="30" /> <label for="b">Aluminium / Dibond</label><br/>
                    </p>
                    <legend>2) Choix format (portrait)</legend>
                    <p><!-- Les radios -->
                        <input type="radio" name="format" checked="checked" id="petit" value="15" /> <label for="c">60x60 cm</label><br/>
                        <input type="radio" name="format" id="moyen" value="25" /> <label for="d">100x100 cm</label><br/>
                        <input type="radio" name="format" id="grand" value="35" /> <label for="e">140x140 cm</label><br/>
                    </p>
                    <legend>3) Choix support</legend>
                    <p><!-- Les radios -->
                        <input type="radio" name="support" checked="checked" id="toile" value="40" /> <label for="f">Toile</label><br/>
                        <input type="radio" name="support" id="bois" value="60" /> <label for="g">Bois</label><br/>
                    </p>
                    Prix: <span id="prix"></span>
                    
A voir également:

10 réponses

prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
10 mai 2013 à 22:33
Hello, Je vais t'aider, je prends connaissance de ton code et je reviens vers toi
0
Paela318 Messages postés 17 Date d'inscription mardi 18 septembre 2012 Statut Membre Dernière intervention 11 mai 2013
10 mai 2013 à 22:39
Merci, c'est super !
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
Modifié par prosthetiks le 10/05/2013 à 22:59
Voici voila !

<html> 
 <head> 
  <title></title> 
 </head> 
 <body> 
    <div id="choix"> 
         <legend>1) Choix finition</legend> 
         <p><!-- Les radios --> 
             <input type="radio" name="finition" checked="checked" id="plexi" value="20"/> <label for="a">Plexiglas</label><br/> 
             <input type="radio" name="finition" id="alu" value="30" /> <label for="b">Aluminium / Dibond</label><br/> 
         </p> 
         <legend>2) Choix format (portrait)</legend> 
         <p><!-- Les radios --> 
             <input type="radio" name="format" checked="checked" id="petit" value="15" /> <label for="c">60x60 cm</label><br/> 
             <input type="radio" name="format" id="moyen" value="25" /> <label for="d">100x100 cm</label><br/> 
             <input type="radio" name="format" id="grand" value="35" /> <label for="e">140x140 cm</label><br/> 
         </p> 
         <legend>3) Choix support</legend> 
         <p><!-- Les radios --> 
             <input type="radio" name="support" checked="checked" id="toile" value="40" /> <label for="f">Toile</label><br/> 
             <input type="radio" name="support" id="bois" value="60" /> <label for="g">Bois</label><br/> 
         </p> 
         Prix: <span id="prix"></span> 
         <button onclick="superCalculateur.calculeLePrixDeMalade()">Calculer</button> 
 </body> 
 <script type="text/javascript"> 
  var superCalculateur = { 
   calculeLePrixDeMalade: function(){ 
    var total = 0; 
    // On récupère tous les inputs
    var elements = document.getElementsByTagName('input'); 
    // on boucle sur les éléments récupérés afin de traiter chaque input séparément 
    for(var element in elements){ 
     var current = elements[element]; 
     // On teste si input est de type Objet, qu'il soit bien de type radio (il pourrait y avoir des input d'autre type, genre text ou password), et enfin qu'il soit coché. 
     if(typeof current == 'object' && current.getAttribute('type') == 'radio' && current.checked){ 
      // Ce code sera exécuté uniquement par les inputs de type radio et qui sont cochés. On récupère donc leur valeur et on l'additionne avec la valeur actuelle de la variable total (le += est un raccourcis pour total = total + current.value) 
      total += parseFloat(current.value); 
     } 
    } 
    // Une fois la boucle terminée, on affiche le contenu de la variable total 
    alert('Total: ' + total); 
   }  
  } 
 </script> 
</html> 
0
Paela318 Messages postés 17 Date d'inscription mardi 18 septembre 2012 Statut Membre Dernière intervention 11 mai 2013
10 mai 2013 à 23:14
Super c'est exactement le résultat que je voulais ! Si tu as un peu de temps à m'offrir encore, j'aimerai te poser quelques questions sur le code (je sais je suis chiant mais j'aime tout comprendre mdr).
- Tout d'abord, pourquoi as tu créé la première variable superCalculateur, à quoi sert elle ?
- Ensuite, je ne comprends pas comment marche la boucle :/
Encore merci pour ton aide !
0

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

Posez votre question
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
Modifié par prosthetiks le 10/05/2013 à 23:44
J'ai créer cette première variable afin d'encapsuler ma fonction, ce n'est pas obligatoire, mais ça permet de mieux organiser son code et d'éviter les conflits avec des fonctions du même nom qui pourraient être déclarées dans d'autres scripts présent dans la même page.

Il y a des noms de fonction relativement courants (du genre getName()) qu'on risque de re-déclarer accidentellement. Je peux donc, grâce à ce système, déclarer une fonction de ce nom même si elle existe déja dans un script chargé précédemment.

C'est une sorte de namespace (je te renvoie à google pour une définition complète des namespaces, disponibles dans la plupart des langages récents)

Décortiquons maintenant le comportement de la boucle:

On commence par récupérer les inputs avec celle ligne:
var elements = document.getElementsByTagName('input'); 


elements est maintenant un tableau dont chaque entrée contient un input différent.
Concrètement, voici le contenu de la variable elements:
0: input#plexi   
1: input#alu   
2: input#petit   
3: input#moyen   
4: input#grand   
5: input#toile   
6: input#bois   
length: 7   


On voit qu'on y trouve, de l'index 0 à 6, les différents inputs de la page.
à l'index 7, qui à comme clé "length", on trouve la longueur totale du tableau. Cette entrée est ajoutée automatiquement par la méthode "getElementsByTagName", ce qui va nous ennuyer lors de notre boucle, on y reviendra en temps voulu.

La boucle:
La ligne
 for(var element in elements){
. Si on la traduisait en français, elle pourrait se transcrire de la sorte: Pour chaque element présent dans elements, passe dans la boucle.

La boucle va donc être exécutée 8 fois, et la variable element (qui est crée à la volée), contiendra à chaque fois la clé du tableau pour l'élément en cours.

Voici les valeurs de element pour chaque passage dans la boucle:

Passage 1: element = 0
Passage 2: element = 1
Passage 3: element = 2
Passage 4: element = 3
Passage 5: element = 4
Passage 6: element = 5
Passage 7: element = 6
Passage 8: element = length

Entrons maintenant dans la boucle.

On y trouve cette ligne:

var current = elements[element];


Donc au premier passage dans la boucle, on va récupérer la valeur qui se trouve dans elements à l'index 0.
Si on reprend le contenu de notre tableau elements, on voit qu'a l'index 0 on trouve: input#plexi

La ligne suivante est:

if(typeof current == 'object' && current.getAttribute('type') == 'radio' && current.checked){


Nous avons donc 3 conditions séparées par des & (ET). Il faut donc que les trois soient respectées pour qu'on entre dans la condition.

Admettons que notre input#plexi soit coché:
La variable est de type "object", elle est de type "radio" et elle possède l'attribut "checked".
On récupère donc sa valeur grâce à la ligne
total += parseFloat(current.value);
et on procède ainsi pour tous les éléments du tableau.

Il y a juste une subtilité: On a vu que notre tableau elements contenait la longue du tableau (à l'index length). Cette entrée n'est pas un objet, c'est un string (une chaine de caractère), c'est pour ça que j'ai mis la condition typeof current == 'object'. Sans elle, j'aurais tenté d'appeler la fonction getAttribute sur une chaine de caractère, hors elle ne la possède pas et mon script aurait planté.

J'espère que cette explication est assez claire :/
0
Paela318 Messages postés 17 Date d'inscription mardi 18 septembre 2012 Statut Membre Dernière intervention 11 mai 2013
10 mai 2013 à 23:55
J'ai du la lire trois fois pour comprendre mais là j'ai bien compris. Merci pour te donner autant de mal pour réussir à m'expliquer tout ça, mais ça me servira :) Et aussi j'ai beau lire les références du ParseFloat et ParseInt, je n'arrive pas à bien comprendre leur fonction, si tu pouvais encore m'éclairer sur ce point j'aurai absolument tout compris ! :)
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
11 mai 2013 à 00:05
Voici un exemple avec une petite explication (qui est en cours de rédaction ;) ):
<html>
	<head>
		<title></title>
	</head>
	<body>

	</body>
	<script type="text/javascript">
		var superCalculateur = {
			calculeLePrixDeMalade: function(){
				var stringValue = '10';
				var intValue = 10;
				var floatValue = 10.5;

				var v0 = stringValue + intValue + floatValue;
				var v1 = parseInt(stringValue) + parseInt(intValue) + parseInt(floatValue);
				var v2 = parseFloat(stringValue) + parseFloat(intValue) + parseFloat(floatValue);

				alert('Sans parser:' + v0 + ' Avec parseInt: ' + v1 + ' avec parseFloat: ' + v2);

			}	
		}
		superCalculateur.calculeLePrixDeMalade();
	</script>
</html>
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
Modifié par prosthetiks le 11/05/2013 à 00:13
Je déclare donc trois variables:
    var stringValue = '10';  
    var intValue = 10;  
    var floatValue = 10.5;  


stringValue est une chaine de caractère (elle est définie entre guillemets)
intValue est un nombre entier (ou int)
floatValue est un nombre à virgule (ou float)

La fonction parseInt permet de convertir une variable en entier
La fonction parseFloat permet de convertir une variable en nombre à virgule

Je fais donc trois calculs différents:

#1
var v0 = stringValue + intValue + floatValue; 

le signe plus servant aussi comme opérateur de concaténation et stringValue étant une chaine de caractère, il va concaténer les trois valeurs et on va obtenir comme valeur: 101010.5
C'est pas ce qu'on veut ! :(

Essayons donc avec parseInt !

#2
var v1 = parseInt(stringValue) + parseInt(intValue) + parseInt(floatValue);


StringValue vaut maintenant 10 et non plus '10' (Il a été converti en entier)
intValue = 10
floatValue = 10 (on a perdu la virgule, on vient de le convertir en entier)

Le résultat du tout est 30, c'est faux ! :(

#3
Reste à tester parseFloat, et en convertissant toutes nos variables avec, on garde la précision de floatValue tout en rendant possible le calcul.
0
Paela318 Messages postés 17 Date d'inscription mardi 18 septembre 2012 Statut Membre Dernière intervention 11 mai 2013
11 mai 2013 à 00:17
Oua merci ! Tu t'es vraiment donné du mal, ça fait plaisir de voir que des gens se donnent autant de mal encore sur les forums :) En tout cas t'as réussi à répondre à mon sujet et à tout m'expliquer, encore merci :)
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
11 mai 2013 à 00:18
De rien, au plaisir :) Bonne suite !
0