Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1352 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [Select + onchange] Recupérer la valeur de l'index précédent

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Select + onchange] Recupérer la valeur de l'index précédent

n°1400144
IvanleFou
Posté le 04-07-2006 à 12:44:49  profilanswer
 

Bonjour,
 
J'ai plusieurs select contenant chacun une liste d'articles et je veux faire le total du cout de chaque article (c'est comme une facture).
 
J'ai 2 solutions pour faire la somme: soit tout recalculer a chaque fois, soit ajouter/retrancher au total le prix de l'article en question. J'ai choisi la 2eme solution car ca devrait etre moins lourd si il y a beaucoup d'article.
 
Le probleme survient lorsque l'utilisateur enleve un article, c'est a dire qu'il choisit l'option "vide" dans le select. A ce moment j'appelle ma fonction qui fait la mise a jour mais j'ai le nouveau index (avec this.options[this.selectedIndex].value) et je ne sais plus comment retrouver l'index de l'objet qui etait selectionné juste avant.
 
La seul solution que je vois c'est de faire une variable par select et d'y stocké la valeur de l'index en cours. Je la mets a jour une fois que j'ai fait mon calcul. Vous voyez une autre solution? :??:  
 
Merci pour vous conseils :jap:

mood
Publicité
Posté le 04-07-2006 à 12:44:49  profilanswer
 

n°1400737
IvanleFou
Posté le 04-07-2006 à 23:20:55  profilanswer
 

Soit elle est vraiment naze ma question soit elle est vraiment difficile [:noxauror]

n°1400741
flo850
moi je
Posté le 04-07-2006 à 23:29:27  profilanswer
 

tu dois pouvoir le faire en stockant l'index dans une variable globale  
 
je vois que ca  

n°1400851
anapajari
s/travail/glanding on hfr/gs;
Posté le 05-07-2006 à 09:25:10  profilanswer
 

flo850 a écrit :

tu dois pouvoir le faire en stockant l'index dans une variable globale  
je vois que ca


c'est exactement ce qu'il expliquait [:mlc]
 
Si l'idée de la variable te plait pas, tu peux aussi la faire DOM-Staïlle, en rajoutant un attribut à ton select qui contiendrait l'ancienne valeur... Mais bon ça revient strictement au même [:spamafote]

n°1400932
IvanleFou
Posté le 05-07-2006 à 11:11:07  profilanswer
 

Non l'idee de la variable ne me deplait pas, au contraire. Je demandais a tout hasard car je connais tres peu le javascript et je me disais que peut etre il existait un attribut pour faire cela et que je ne connaitrais pas :)  
 
J'ai fait avec la variable est ca marche bien, merci pour votre confirmation :hello:  
 
 :jap:

n°1401474
gatsu35
Blablaté par Harko
Posté le 05-07-2006 à 20:58:11  profilanswer
 

codé en 5 minutes à l'arrache :  

Code :
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <title></title>
  5. <script type="text/javascript">
  6. function checkarticles() {
  7.  var form = document.getElementById("formulaire" );
  8.  var select = form.getElementsByTagName("select" );
  9.  var count = 0;
  10.  for (var i=0; i<select.length; i++) {
  11.   if (select[i].name=="article[]" ) count+=parseInt(select[i].value);
  12.  }
  13.  document.getElementById("total" ).innerHTML = count;
  14. }
  15. </script>
  16. </head>
  17. <body>
  18. <form id="formulaire">
  19. <select name="quinarienavoiravectoutca">
  20. <option value="0"> Select qui n'est pas de type article</option>
  21. <option value="40">ya rien a voir</option>
  22. <option value="20">pas d'article</option>
  23. <option value="25">DTC</option>
  24. </select>
  25. <select name="article[]" onchange="checkarticles()">
  26. <option value="0"> </option>
  27. <option value="40">Pouet</option>
  28. <option value="20">Prout</option>
  29. <option value="25">Caca</option>
  30. </select>
  31. <select name="article[]" onchange="checkarticles()">
  32. <option value="0"> </option>
  33. <option value="40">Pouet</option>
  34. <option value="20">Prout</option>
  35. <option value="25">Caca</option>
  36. </select>
  37. <select name="article[]" onchange="checkarticles()">
  38. <option value="0"> </option>
  39. <option value="40">Pouet</option>
  40. <option value="20">Prout</option>
  41. <option value="25">Caca</option>
  42. </select>
  43. <select name="article[]" onchange="checkarticles()">
  44. <option value="0"> </option>
  45. <option value="40">Pouet</option>
  46. <option value="20">Prout</option>
  47. <option value="25">Caca</option>
  48. </select>
  49. <strong>Total : <span id="total"></span></strong>
  50. </form>
  51. </body>
  52. </html>


 
Tu peux mettre autant d'articles que tu veux, mais je ne pense pas que tu atteindra les 100 articles dans ta page, et même avec 100 articles, on est très loin de ramer.
 
et ce que tu cherche toi à faire est possible mais super chiant pour l'utilisateur, et ne risque de fonctionner que si l'utilisateur utilise sa souris (j'ai déjà l'algo en tête). Mais ce n'est pas forcément super top.
Alors qu'une simple boucle ca suffit
 
sinon avec la version de test du fichier :  
 
Tests : sous IE avec 780 selects il faut 500ms pour executer la fonctions :|
 
sous FF, moins de 100 ms :|
 
la fonction dans sa version de test :  

Code :
  1. function checkarticles() {
  2.  var timer1 = new Date().getTime();
  3.  var form = document.getElementById("formulaire" );
  4.  var select = form.getElementsByTagName("select" );
  5.  var count = 0;
  6.  for (var i=0; i<select.length; i++) {
  7.   if (select[i].name=="article[]" ) count+=parseInt(select[i].value);
  8.  }
  9.  document.getElementById("total" ).innerHTML = count;
  10.  var timer2 = new Date().getTime();
  11.  alert(timer2-timer1+"ms, "+select.length+" selects" );
  12. }

n°1401482
gatsu35
Blablaté par Harko
Posté le 05-07-2006 à 21:13:07  profilanswer
 

Mais sinon pour répondre à ta question (du coup mon code au dessus tu peux le jeter) :  

Code :
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <title></title>
  5. <script type="text/javascript">
  6. function checkarticles(obj) {
  7.  if (!obj) return; //on teste si l'objet est la
  8.  var total = document.getElementById("total" ); //on recupere l'element du total
  9.  if (total.innerHTML=="" ) total.innerHTML="0"; //on regarde s'il y a du texte dans le total, sinon par defaut c'est 0
  10.  var lastvalue = 0;
  11.  // on regarde si le select avec une ancienne valeur
  12.  if (obj.getAttribute('lastvalue')!=null) { //si le select a deja eu une ancienne valeur
  13.   lastvalue = obj.getAttribute('lastvalue'); //on la recupere sinon 0
  14.  }
  15.  // on fait une operation toute simple : total = total-anciennevaleur+nouvellevaleur;
  16.  total.innerHTML = parseInt(total.innerHTML)-parseInt(lastvalue)+parseInt(obj.value);
  17.  obj.setAttribute('lastvalue',obj.value); //on met la nouvelle valeur du select selectionne en tant qu'ancienne valeur;
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <form id="formulaire">
  23. <strong>Total : <span id="total"></span></strong><br>
  24. <select name="article[]" onchange="checkarticles(this)">
  25. <option value="0"> </option>
  26. <option value="40">Pouet</option>
  27. <option value="20">Prout</option>
  28. <option value="25">Caca</option>
  29. </select>
  30. <select name="article[]" onchange="checkarticles(this)">
  31. <option value="0"> </option>
  32. <option value="40">Pouet</option>
  33. <option value="20">Prout</option>
  34. <option value="25">Caca</option>
  35. </select>
  36. <select name="article[]" onchange="checkarticles(this)">
  37. <option value="0"> </option>
  38. <option value="40">Pouet</option>
  39. <option value="20">Prout</option>
  40. <option value="25">Caca</option>
  41. </select>
  42. </form>
  43. </body>
  44. </html>


 
explication : Je pars du principe que par défaut l'ancienne valeur d'un select c'est zero ou par défaut la valeur selectionee au chargement de la page, ou si tu l'as initialisé dans la page c'est :  
<select lastvalue="valeurselectionne">
 
du coup lorsque tu changes la valeur du select, tu as l'ancienne valeur, et la nouvelle valeur sélectionnée va devenir ancienne valeur à son tour. entre temps on fait l'operation simple decrite dans les commentaires du code.


Message édité par gatsu35 le 05-07-2006 à 21:13:35
n°1401484
IvanleFou
Posté le 05-07-2006 à 21:18:31  profilanswer
 

:)  
 
Sympa la maniere de selectionner tous les select les uns apres les autres (pour vous ca doit paraitre trivial mais comme je l'ai dit je m'y connais tres peu en javascript et je ne connaissais pas cette methode).
 
Je vais tester les 2 versions.
 
Merci Gatsu35. :jap:

n°1401492
gatsu35
Blablaté par Harko
Posté le 05-07-2006 à 21:53:04  profilanswer
 

j'ai dit tu peux jeter ma Première fonction à la poubelle :o (celle qui va checker tous les selects)
 
Ici c'est la solution que tu recherches, avoir une ancienne valeur, là tu peux mettre 15000 selects c'est ultra rapide :o
Tiens j'ai amélioré le bouzin, parce que sous Opera, ce con me rendait pas forcément des nombres malgré un parseInt, cette fois-ci je recupère vraiment des nombres.

Code :
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <title></title>
  5. <script type="text/javascript">
  6. function checkarticles(obj) {
  7.  if (!obj) return; //on teste si l'objet est la
  8.  var total = document.getElementById("total" ); //on recupere l'element du total
  9.  var temptotal = parseInt((document.all) ? total.innerText : total.textContent); //on recupere temptotal en string
  10.  if (!isFinite(temptotal)) temptotal = 0; //on teste si temptotal est bien un nombre
  11.  var value = parseInt(obj.value);
  12.  if (!isFinite(value)) value = 0; //on teste si value est bien un nombre
  13.  var lastvalue = 0;
  14.  // on regarde si le select avec une ancienne valeur
  15.  if (obj.getAttribute('lastvalue')!=null) { //si le select a deja eu une ancienne valeur
  16.   lastvalue = obj.getAttribute('lastvalue'); //on la recupere sinon 0
  17.   if (!isFinite(lastvalue)) lastvalue = 0;
  18.  }
  19.  // on fait une operation toute simple : total = total-anciennevaleur+nouvellevaleur;
  20.  //alert("'"+lastvalue+"','"+obj.value+"' - "+temptotal+","+parseInt(lastvalue)+","+parseInt(obj.value));
  21.  total.innerHTML = temptotal-lastvalue+value;
  22.  obj.setAttribute('lastvalue',obj.value); //on met la nouvelle valeur du select selectionne en tant qu'ancienne valeur;
  23. }
  24. </script>
  25. </head>
  26. <body>
  27. <form id="formulaire">
  28. <strong>Total : <span id="total">-5</span></strong><br>
  29. <select name="article[]" onchange="checkarticles(this)">
  30. <option value="0"> </option>
  31. <option value="40">Pouet</option>
  32. <option value="20">Prout</option>
  33. <option value="25">Caca</option>
  34. </select>
  35. <select name="article[]" onchange="checkarticles(this)">
  36. <option value="0"> </option>
  37. <option value="40">Pouet</option>
  38. <option value="20">Prout</option>
  39. <option value="25">Caca</option>
  40. </select>
  41. <select name="article[]" onchange="checkarticles(this)">
  42. <option value="0"> </option>
  43. <option value="40">Pouet</option>
  44. <option value="20">Prout</option>
  45. <option value="25">Caca</option>
  46. </select>
  47. <select name="article[]" onchange="checkarticles(this)">
  48. <option value="0"> </option>
  49. <option value="40">Pouet</option>
  50. <option value="20">Prout</option>
  51. <option value="25">Caca</option>
  52. </select>
  53. </form>
  54. </body>
  55. </html>


Message édité par gatsu35 le 05-07-2006 à 21:54:37
n°1402724
IvanleFou
Posté le 07-07-2006 à 12:25:21  profilanswer
 

Je me suis servi de ta premiere fonction (en la modifiant un peu) pour un autre script :bounce:  :bounce:  
 
 :hello:

mood
Publicité
Posté le 07-07-2006 à 12:25:21  profilanswer
 

n°1402747
gatsu35
Blablaté par Harko
Posté le 07-07-2006 à 12:59:01  profilanswer
 

tu fais ce que tu veux mais la deuxieme répond à ton besoin et est beaucoup plus propre que la premiere

n°1402756
IvanleFou
Posté le 07-07-2006 à 13:05:30  profilanswer
 

Oui mais le contexte n'est pas le meme la ou je l'ai utilisé et il y va tres bien.
 
Ta 2eme version je m'y attaque ce soir pour la mettre dans le script qui est a l'origine de ce topic ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [Select + onchange] Recupérer la valeur de l'index précédent

 

Sujets relatifs
recuperer l'id de la page en JSonChange fonctionne sous Firefox mais pas IE...
récuperer le nom d une pagerecuperer un xml dans un blob
[résolu] Pb de onChange (désolé)Récupérer les valeurs d'un champ au nom variable
[résolu] SELECT défaillant ...[Excel] Comment obtenir la dernière valeur ?
[Batch-dos] Récupérer nom sessionSocket, recv, send et select qui ne marche pas
Plus de sujets relatifs à : [Select + onchange] Recupérer la valeur de l'index précédent


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR