Calculer le pourcentage de nombre de cases cochée

Résolu/Fermé
henri - 19 déc. 2020 à 16:30
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 20 déc. 2020 à 12:13
Bonjour,
je cherche a calculer le pourcentage de cases qui sont cochée en en fonction de celui-ci changer une image.
voici le code que j'ai tenter pour faire ça:

<p class=textbox> <input type="checkbox" id="box1"  onclick="nbtf();moy()" >  </p>
<p class=textbox> <input type="checkbox" id="box2"  onclick="moy();nbtf()"/> </p>
<p class=textbox> <input type="checkbox" id="box3"  onclick="moy();nbtf()"/> </p>
<p class=textbox> <input type="checkbox" id="kbox4"  onclick="moy();nbtf()"/></p>
<script>
var tf = 0;//tf correspond au nombre de cases cochée
var t = 4; // nombre de cases total
var p = 0; //pourcntage de case cochée
function nbtf(){	//fonction qui compte le nombre de case cochée
		if( x.checked == true ){
			tf += 1;
		}
		else{
			tf -= 1;
		}	
	}
function moy(){	// fonction qui fais correspondre un % à une image
		var p = 100*(tf/t)
		if (p>=0 && p<12,5){	
			document.getElementById("cerlceR").// on prend la moitier de la difference entre  chaque % qui correspond a une image
			src = "../images/cercleR0.png;
			
		}
		if (p>=12,5 && p<37,5){
			document.getElementById("cerlceR").
			src = "../images/cercleR25.png;
		}
		if (p>=37,5 && p<62,5){
			document.getElementById("cerlceR").
			src = "../images/cercleR50.png;
		}
		if (p>=62,5 && p<87,5){
			document.getElementById("cerlceR").
			src = "../images/cercleR75.png;

		}
		if (p>=87,5 && p<=100){
		document.getElementById("cerlceR").
		src = "../images/cercleR100.png;
		}
	}

6 réponses

Utilisateur anonyme
19 déc. 2020 à 16:35
Bonjour,
Je n'ai pas regardé le code en détail mais la notation décimale doit se faire avec le point (.) et par la virgule.
0
merci ça fais une faute en moins.
voici le code avec quelque corrections:
<p class=textbox> <input type="checkbox" id="box1"  onclick="moy(this);nbtf(this)" >  </p>
<p class=textbox> <input type="checkbox" id="box2"  onclick="moy(this);nbtf(this)"/> </p>
<p class=textbox> <input type="checkbox" id="box3"  onclick="moy(this);nbtf(this)"/> </p>
<p class=textbox> <input type="checkbox" id="box4"  onclick="moy(this);nbtf(this)"/></p>
<script>
var tf = 0;//tf correspond au nombre de cases cochée
var t = 4; // nombre de cases total
var p = 0; //pourcntage de case cochée
function nbtf(tf){ //fonction qui compte le nombre de case cochée
  if( x.checked == true ){
   tf += 1;
  }
  else{
   tf -= 1;
  } 
 }
function moy(p,tf,t) { // fonction qui fais correspondre un % à une image
  var p = 100*(tf/t);
  if (p>=0 && p<12.5){ 
   document.getElementById("cerlceR").// on prend la moitier de la difference entre  chaque % qui correspond a une image
   src = "../images/cercleR0.png";
   
  }
  if (p>=12.5 && p<37.5){
   document.getElementById("cerlceR").
   src = "../images/cercleR25.png";
  }
  if (p>=37.5 && p<62.5){
   document.getElementById("cerlceR").
   src = "../images/cercleR50.png";
  }
  if (p>=62.5 && p<87.5){
   document.getElementById("cerlceR").
   src = "../images/cercleR75.png";

  }
  if (p>=87.5 && p<=100){
  document.getElementById("cerlceR").
  src = "../images/cercleR100.png";
  }
 }
</script>


Ce code ne fais rien enfin on peux appuier sur les differents boutton mais rien ne se produit(l'image que je souhaite modifier est deja presente au depart).
Avez-vous des solutions à m'apporter svp?
0
Utilisateur anonyme > henri
Modifié le 19 déc. 2020 à 16:50
Il manque le guillemet fermant passé à la chaine .src ...

Et ligne 12 : Alert
0
henri > Utilisateur anonyme
19 déc. 2020 à 16:50
Oula!!
oui merci je n'avais même pas vue.
0
Utilisateur anonyme > henri
Modifié le 19 déc. 2020 à 16:57
et personnellement; je préfère mettre le point-virgule à la fin de chaque ligne même lorsque c'est facultatif : ligne 18,
0
henri > Utilisateur anonyme
19 déc. 2020 à 17:00
Merci, avez-vous d'autres erreurs qui empêche le programme de fonctionner?
0
Désolé, je n'avais pas vu votre message 10 ! et en effet, c'est bien du javascript ! (re désolé !)

Ca ne marche toujours pas ?
0
je ne vois pas le problème, j'ai bien écrit <script> et </script> au début et a la fin de mon programme en javascript.
0
Utilisateur anonyme
19 déc. 2020 à 17:37
Nos messages 11 et 12 se sont croisés ! Désolé.
Je suis plusieurs sujets en même temps : je ne devrais pas !

C'est OK maintenant ?
0
henri > Utilisateur anonyme
19 déc. 2020 à 17:39
Pas de problème.
Non, le programme ne fonctionne pas.
0
Utilisateur anonyme > henri
19 déc. 2020 à 18:04
En regardant le détail ;

Comment est définie la variable x ?
Vous appelez les fonctions ainsi : onclick="moy(this);nbtf(this)"

or moy() est définie avec 3 paramètres numériques; et nbtf ()avec un paramètre numérique.

L'appel avec this comme paramètre ne peut pas fonctionner !

Si votre code complet n'est pas trop long, et qu'il ne contient rien de confidentiel, il faudrait le mettre en ligne...
0
henri > Utilisateur anonyme
Modifié le 19 déc. 2020 à 18:15
Aucun souci le voici:
<!DOCTYPE html >
<html > 
<head>
    <title>SUIVRE SES OBJECTIFS</title>
 <link rel="icon"  href="..\images\icon.png" />
</head>
<body>

<P><HR SIZE="5" color=black></P>

 <center>
 <img alt="000%" title="000%" class=cercle id=cercleR src="../images/cercleR0.png" >
  <img alt="100%"title="100%" class=cercle id=cercleV src="../images/cercleV100.png" >
   <img alt="50%"title="75%"class=cercle id=cercleB src="../images/cercleB75.png" >
   <img alt="50%"title="50%"class=cercle id=cercleJ src="../images/cercleJ50.png" >
</center>
<a href="objse.html" class=lien> <h3   class=center> OBJECTIF DE LA SEMAINE </h3> </a>
<P><HR SIZE="5" color=black></P>

<center>
<img  class=ex src="../images/box1.png" alt=" Fait 1x">  
<img class=ex src="../images/box2.png" >  
<img class=ex src="../images/box3.png" >  
<img class=ex src="../images/box4.png" >  
<img  class=ex src="../images/box5.png" >  
<img class=ex src="../images/box6.png" >  
<img class=ex src="../images/box7.png" >
</center>
<P><HR SIZE="5" color=black></P>

<h3>A faire aujourd'hui:</h3>

<p class=textbox> <input type="checkbox" id="box1"  onclick="moy();nbtf()" > objectif 1 </p>
<p class=textbox> <input type="checkbox" id="box2"  onclick="moy();nbtf()"/> objectif 2</p>
<p class=textbox> <input type="checkbox" id="box3"  onclick="moy();nbtf()"/> objectif 3</p>
<p class=textbox> <input type="checkbox" id="box4"  onclick="moy();nbtf()"/> objectif 4</p>

<br><br><br>
<h3>A faire une fois par jour:</h3>

<p class=textbox><img class=box id=myimg1 src="../images/box1.png" onclick="ch_img1()"> objectif 1</p> 
<p class=textbox><img class=box id=myimg2 src="../images/box1.png" onclick="ch_img2()"> objectif 2</p>
<p class=textbox><img class=box id=myimg3 src="../images/box1.png" onclick="ch_img3()"> objectif 3</p>
<p class=textbox><img class=box id=myimg4 src="../images/box1.png"onclick="ch_img4()">  objectif 4</p>
<p class=textbox><img class=box id=myimg5 src="../images/box1.png" onclick="ch_img5()"> objectif 5</p>

<script>
var tf = 0
var t = 4; // nombre de cases total
var p = 0; //pourcntage de case cochée
function nbtf(tf){ //fonction qui compte le nombre de case cochée
  if( x.checked == true ){
   tf = tf + 1;
  }
  else{
   tf =tf - 1;
  } 
 }
function moy(p,tf,t) { // fonction qui fais correspondre un % à une image
  var p = 100*(tf/t);
  if (p>=0 && p<12.5){ 
   document.getElementById("cerlceR").// on prend la moitier de la difference entre  chaque % qui correspond a une image
   src = "../images/cercleR0.png";
   
  }
  else if (p>=12.5 && p<37.5){
   document.getElementById("cerlceR").
   src = "../images/cercleR25.png";
  }
  else if (p>=37.5 && p<62.5){
   document.getElementById("cerlceR").
   src = "../images/cercleR50.png";
  }
  else if (p>=62.5 && p<87.5){
   document.getElementById("cerlceR").
   src = "../images/cercleR75.png";

  }
  else if (p>=87.5 && p<=100){
  document.getElementById("cerlceR").
  src = "../images/cercleR100.png";
  }
 }
var x = 2;
 function ch_img1(){
  document.getElementById("myimg1").
  src = "../images/box"+x+".png";
  x++;
  if(x>=8){
   x=1;
  }
 }
var x2 = 2;
 function ch_img2(){
  document.getElementById("myimg2").
  src = "../images/box"+x2+".png";
  x2++;
  if(x2>=8){
   x2=1;
  }
 } 
var x3 = 2;
 function ch_img3(){
  document.getElementById("myimg3").
  src = "../images/box"+x3+".png";
  x3++;
  if(x3>=8){
   x3=1;
  }
 } 
var x4 = 2;
 function ch_img4(){
  document.getElementById("myimg4").
  src = "../images/box"+x4+".png";
  x4++;
  if(x4>=8){
   x4=1;
  }
 } 
var x5 = 2;
 function ch_img5(){
  document.getElementById("myimg5").
  src = "../images/box"+x5+".png";
  x5++;
  if(x5>=8){
   x5=1;
  }
 } 
</script>

</body>
</html>
0
Je me suis concentré sur le problème identifié au départ. J'ai commenté les modifications et ajouts autant que possible :

<!DOCTYPE html >
<html > 
<head>
    <title>SUIVRE SES OBJECTIFS</title>
 <link rel="icon"  href="..\images\icon.png" />
</head>

<body>
 <HR SIZE="5" color=black> <!-- balise de tyoe block : la mettre dans un paragraphe n'est pas nécessaire--> 
 <center>
 <img alt="000%" title="000%" class=cercle id=cercleR src="../images/cercleR0.png" >
 <img alt="100%" title="100%" class=cercle id=cercleV src="../images/cercleV100.png" >
 <img alt="50%" title="75%" class=cercle id=cercleB src="../images/cercleB75.png" >
 <img alt="50%" title="50%" class=cercle id=cercleJ src="../images/cercleJ50.png" >
 </center>
 <a href="objse.html" class=lien><h3 class=center> OBJECTIF DE LA SEMAINE </h3></a>
 <HR SIZE="5" color=black>

 <center>
 <img class=ex src="../images/box1.png" alt=" Fait 1x">  
 <img class=ex src="../images/box2.png" >  
 <img class=ex src="../images/box3.png" >  
 <img class=ex src="../images/box4.png" >  
 <img class=ex src="../images/box5.png" >  
 <img class=ex src="../images/box6.png" >  
 <img class=ex src="../images/box7.png" >
 </center>
 <P><HR SIZE="5" color=black></P>

 <h3>A faire aujourd'hui:</h3>

 <p class=textbox> <input type="checkbox" id="box1"  onclick="moy();nbtf(this)" > objectif 1 </p>
 <p class=textbox> <input type="checkbox" id="box2"  onclick="moy();nbtf(this)"/> objectif 2</p>
 <p class=textbox> <input type="checkbox" id="box3"  onclick="moy();nbtf(this)"/> objectif 3</p>
 <p class=textbox> <input type="checkbox" id="box4"  onclick="moy();nbtf(this)"/> objectif 4</p>

 <br><br><br>
 <h3>A faire une fois par jour:</h3>

 <p class=textbox><img class=box id=myimg1 src="../images/box1.png" onclick="ch_img1()"> objectif 1</p> 
 <p class=textbox><img class=box id=myimg2 src="../images/box1.png" onclick="ch_img2()"> objectif 2</p>
 <p class=textbox><img class=box id=myimg3 src="../images/box1.png" onclick="ch_img3()"> objectif 3</p>
 <p class=textbox><img class=box id=myimg4 src="../images/box1.png" onclick="ch_img4()"> objectif 4</p>
 <p class=textbox><img class=box id=myimg5 src="../images/box1.png" onclick="ch_img5()"> objectif 5</p>

 <script>
 var tf = 0
 const t = 4; // nombre de cases total
// var p = 0; //pourcntage de case cochée
 
 function nbtf(x){ //fonction qui compte le nombre de case cochée
 //**** ICI x sera la chexkbox passée par this (rajouté) dans l'appel *****
   if(x.checked == true ){
    tf = tf + 1;
   }
   else{
    tf =tf - 1;
   } 
  }
 
 
 function moy(){ // fonction qui fais correspondre un % à une image
   /****** 
   pas besoin de définir p en dehors comme variable globale puisqu'elle n'est utilisée qu'ici
   on pourrait faire pareil et declarer tf et t ici. d'ailleurs je déclare t comme une constante (ligne 48)
   
   du coup, pas besoin de passer des paramètres à moy()
   */
   var p = 100*(tf/t);
   /*** il y avait une erreur de frappe : cerlceR au lieu de cercleR
   on va se simplifier la vie en déclarant une variable cercle :
   */
   
   var cercle=document.getElementById("cercleR")
   if (p>=0 && p<12.5){ 
    cercle.// on prend la moitier de la difference entre chaque % qui correspond a une image
    src = "../images/cercleR0.png";  
   }
   else if (p>=12.5 && p<37.5){
    cercle.src = "../images/cercleR25.png";
   }
   else if (p>=37.5 && p<62.5){
    cercle.src = "../images/cercleR50.png";
   }
   else if (p>=62.5 && p<87.5){
    cercle.src = "../images/cercleR75.png";
   }
   else if (p>=87.5 && p<=100){
    cercle.src = "../images/cercleR100.png";
   }
 }
 
 var x = 2;
 /*** on est d'accord, ce n'est pas le même x que dans la fonction nbtf !? */
 function ch_img1(){
   document.getElementById("myimg1").
   src = "../images/box"+x+".png";
   x++;
   if(x>=8){
    x=1;
   }
  }
 var x2 = 2;
  function ch_img2(){
   document.getElementById("myimg2").
   src = "../images/box"+x2+".png";
   x2++;
   if(x2>=8){
    x2=1;
   }
  } 
 var x3 = 2;
  function ch_img3(){
   document.getElementById("myimg3").
   src = "../images/box"+x3+".png";
   x3++;
   if(x3>=8){
    x3=1;
   }
  } 
 var x4 = 2;
  function ch_img4(){
   document.getElementById("myimg4").
   src = "../images/box"+x4+".png";
   x4++;
   if(x4>=8){
    x4=1;
   }
  } 
 var x5 = 2;
  function ch_img5(){
   document.getElementById("myimg5").
   src = "../images/box"+x5+".png";
   x5++;
   if(x5>=8){
    x5=1;
   }
  } 
 </script>

 </body>
</html>
0
merci beaucoup ,c'est mieux mais pas encore parfait…
en gros l'image ne change seulement quand on coche puis recoche la case si on coche une case il y a pas de changement, si on en coche deux ca affiche 25% au lieu de 50% puis ca augmente de 25% par case cocher donc si on les coche tout ca affiche 75% et non 100% .ensuite si en décoche une ça passe a 100%. C'est plutôt étrange.
0

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

Posez votre question
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
19 déc. 2020 à 23:25
Bonjour,

Le code peut être largement simplifié ..
<!DOCTYPE html >
<html > 
<head>
  <title>SUIVRE SES OBJECTIFS</title>
  <link rel="icon"  href="..\images\icon.png" />
  <meta charset="utf-8">
</head>

<body>
 <HR SIZE="5" color=black> <!-- balise de tyoe block : la mettre dans un paragraphe n'est pas nécessaire--> 
 <center>
 <img alt="000%" title="000%" class="cercle" id="cercleR" src="../images/cercleR0.png" >
 <img alt="100%" title="100%" class="cercle" id="cercleV" src="../images/cercleV100.png" >
 <img alt="50%" title="75%" class="cercle" id="cercleB" src="../images/cercleB75.png" >
 <img alt="50%" title="50%" class="cercle" id="cercleJ" src="../images/cercleJ50.png" >
 </center>
 <a href="objse.html" class="lien">
   <h3 class="center"> OBJECTIF DE LA SEMAINE </h3>
 </a>
 <HR SIZE="5" color="black">

 <center>
 <img class=ex src="../images/box1.png" alt=" Fait 1x">  
 <img class=ex src="../images/box2.png" >  
 <img class=ex src="../images/box3.png" >  
 <img class=ex src="../images/box4.png" >  
 <img class=ex src="../images/box5.png" >  
 <img class=ex src="../images/box6.png" >  
 <img class=ex src="../images/box7.png" >
 </center>
 <P><HR SIZE="5" color=black></P>

 <h3>A faire aujourd'hui:</h3>

 <p class="textbox"> <input type="checkbox" id="box1"  class="today" onclick="moy();" > objectif 1 </p>
 <p class="textbox"> <input type="checkbox" id="box2"  class="today" onclick="moy();"/> objectif 2</p>
 <p class="textbox"> <input type="checkbox" id="box3"  class="today" onclick="moy();"/> objectif 3</p>
 <p class="textbox"> <input type="checkbox" id="box4"  class="today" onclick="moy();"/> objectif 4</p>

 <br><br><br>
 <h3>A faire une fois par jour:</h3>

 <p class="textbox"><img class="box" id="myimg1" src="../images/box1.png" data-numimg="1" onclick="ch_img(this.id)"> objectif 1</p> 
 <p class="textbox"><img class="box" id="myimg2" src="../images/box1.png" data-numimg="1" onclick="ch_img(this.id)"> objectif 2</p>
 <p class="textbox"><img class="box" id="myimg3" src="../images/box1.png" data-numimg="1" onclick="ch_img(this.id)"> objectif 3</p>
 <p class="textbox"><img class="box" id="myimg4" src="../images/box1.png" data-numimg="1" onclick="ch_img(this.id)"> objectif 4</p>
 <p class="textbox"><img class="box" id="myimg5" src="../images/box1.png" data-numimg="1" onclick="ch_img(this.id)"> objectif 5</p>

 <script>

 function getNbTf(){
  let nb = 0;
  const ckb = document.querySelectorAll("input[type=checkbox].today");
    [...ckb].forEach( el => {
      if( el.checked ) {
        nb++;
      } 
    });
    return nb;
 }
 
 function moy(){ // fonction qui fais correspondre un % à une image
   var tf = getNbTf();
   var p = 100*(tf/t);
   var imgP="";

   if (p>=0 && p<12.5){ 
     imgP = "../images/cercleR0.png";  
   } else if (p>=12.5 && p<37.5){
     imgP ="../images/cercleR25.png";
   } else if (p>=37.5 && p<62.5){
    imgP = "../images/cercleR50.png";
   } else if (p>=62.5 && p<87.5){
     imgP = "../images/cercleR75.png";
   } else if (p>=87.5 && p<=100){
     imgP = "../images/cercleR100.png";
   }
   //console.log('Moyenne :',p);
   document.getElementById("cercleR").src = imgP;
 }
 
 function ch_img(idImg){
   //utilisation des data attributes pour stocker l'infos de l'image affichée
   //https://developer.mozilla.org/fr/docs/Apprendre/HTML/Comment/Utiliser_attributs_donnes
   var img = document.getElementById(idImg);
   var img_num = parseInt(img.dataset.numimg) +1 ;
   console.log("id_img", idImg,"img_num",img_num);
   img.src = "../images/box"+img_num+".png";
   
   if(img_num>=8){
     img.dataset.numimg = 0;
   }else{
     img.dataset.numimg = img_num;
   }
  }
 
 
 </script>

 </body>
</html>

0
Utilisateur anonyme
20 déc. 2020 à 09:36
Bonjour,
Avec Jordane, vous avez un exemple de ce qui peut se faire de mieux en matière de concision et donc de clarté du code : la façon de nommer les variables, les déclarations de variables globales ou locales.... J'en apprend beaucoup en lisant ses exemples de programmes !

Elle a mis le doigt sur un point qui méritait vraiment d'être changé : la recherche de l'état des checkbox.

A part ça, un truc vraiment utile pour débuguer, c'est l'utilisation des outils de développement web intégrés aux navigateurs. On y accède avec Ctrl+Maj+I.
Parmi tous les outils, la console permet :
- de connaître l'emplacement et nature des erreurs de syntaxe ;
- d'espionner le contenu d'une variable : exemple en décommentant la ligne 78 (Jordane45) on verra "p" ou en ajoutant un "console.log(tf)" dans votre code initial plutôt que "alert(tf)"

Bonne continuation
0
merci beaucoup tout et parfait maintenant vous aviez juste oublier de définir la variable t (nombres de cases total) et ne coprend pas la fonction qui permet de calculer le nombre de cases qui sont cochées
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
20 déc. 2020 à 12:13
Tu penseras à mettre le sujet en RESOLU.
0