Liste Dynamique en fonction des valeurs déjà choisies [Résolu]

Signaler
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009
-
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
-
Bonjour,

Je souhaite faire un formulaire avec un nombre aléatoire d'<option> dans un <select> pour établir un classement.

En fait, j'ai un nombre d'élément définit que je récupère dans en bdd via php.
Je veux en faire un tableau avec, en face chaque élément, une liste <select> contenant les <option> 1,2,3,...,nb_élément ......... et surtout que chaque liste se mette à jour en fonction des valeurs déjà sélectionnées dans les autres listes !?

Par avance, merci :)

18 réponses

Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
document.classement["element"+i].length=0
et plutôt qu'un for, un while
i=1;
while ( document.classement["element"+i] )
{  traitement de document.classement["element"+i]
   i++;
} 
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
Bonjour,
>>nombre aléatoire d'<option> dans un <select>
variable non plutôt qu'aléatoire ?
suffit de les créer
foultitudes méthodes, exemple
le_select.length++;
le_select.options[le_select.length-1].value="le value"
le_select.options[le_select.length-1].text="le texte"

>>j'ai un nombre d'élément définit que je récupère
>>dans en bdd via php.
ah... c'est donc bien variable at pas aléatoire
>>faire un tableau avec, en face chaque élément,
>>une liste <select> contenant les <option> >>1,2,3,...,nb_élément .........
appliquer la 1ère réponse à chaque éléments
>>que chaque liste se mette à jour en fonction
>>des valeurs déjà sélectionnées dans les autres listes
histoires des select liés ?
petit exemple ici ( 1-javascript 2-php 3-ajax
c'est une exemple avec 2 select, vous
généraliserez pour n )
Cordialement [mon Site] [M'écrire] Bul
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
quoique, pour la dernière question,
si ça se trouve c'est invalider l'option
qu'on choisit dans les autres select ?
_ effacer le .text
_ détruite l'option
le_select.remove(n° de l'option)
oeuf corse, ça oblige à reconstruire les
select en cas de changement
_ ...
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Merci pour ton aide,
mais j'ai du mal m'expliquer...
où alors je suis trop mauvais pour adapter à mes besoins (c'est bien possible aussi).

En fait, il faudrait que j'arrive à atteindre les numéro d'option non-selectionnés pour les supprimer.
J'ai trouvé ce code pour supprimer des éléments de liste
document.formulaire.liste.options[5] = null;
mais je n'arrive pas a remplacer "liste" par le nom de liste. Pa exemple, dans une boucle while, j'ai mis
document.formulaire.'element'+z.options[5] = null;
mais ça ne fonctionne pas (Oui, je débute en JS, j'ai des pb de manipulaiton de variable).

Sinon, est-ce qu'il ne serait pas possible d'ajouter seulement les <select></select> avec PHP, créer un tableau JS contenant les valeurs 1,2,3,X puis pour chaque liste, ajouter les <options></options> encore existant dans le tableau. Ensuite, à la selection dans une liste, je supprime la valeur selectionnée du tableau JS, ainsi toutes mes listes sont mises à jour ? je sais pas si je suis clair et si ça peut marcher fonctionnellement parlant.

Merci pour votre aide
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
pour "atteindre" les select ?
ça dépend de comment ils sont "décrit".
vous semblez avoir un formulaire
et des select avec le même name (?)
<form name="formulaire"....>
    <select name="liste"...></select>
    <select name="liste"...></select>
....
</form>
dans ce cas il faut utiliser
document.formulaire.liste[n° du select]
sachant que document.formulaire.liste.length
c'est le nombre de select name="liste"

vous ne répondez pas tout à fait à mes questions,
mais je pense que c'est bien "effacer dans les
autres select une option choisie dans un select"
que vous voulez faire (?)
=null comme vous le proposez ????
pas sûr ( à tester )
n'oubliez pas, qu'après une suppression,
cette option n'existe plus et que si c'est
l'option 2 que vous avez supprimé elle est
"remplacée" par l'option 3
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
ch'tiot exemple :
je suppose 3 select avec 3 choix :
1 1 1
2 2 2
3 3 3
on choisit 2 dans le select 1 ==>
select 1 vide, 2 dans le select 2 et select 3 disparaissent
. 1 1
. 3 3
on choisit 3 sans le 2 ==>
select 2 vide, 3 dans le select 3 disparait
. . 1

ah... ben non... je voudrais
modifier et choisir 3 dans le 1
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Oui, Oui, c'est exactement ce que je veux.

Pour répondre à une question précédente, les name de mes <select> sont element1,element2,element3,elementX ... faut-il qu'il portent le même name ??

Et pour la problématique des lignes supprimées, est-ce qu'il est possible, dans le cas d'un changement de valeur dans une liste, de transmettre l'ancienne valeur à une autre fonction pour remettre cette valeur dans les autres listes ?
Sinon, en un peu moins propre certes, il est peut-être possible d'afficher un bouton pour réinitialiser les listes ?

Merci encore.
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

En fait, pour le moment, je contruis mes select avec une boucle PHP :
   $i=1;
   while ($i <= $NB_element)
      {
      echo '<tr>';
      echo '<td style="width:150px; text-align:center">'.$TAB_element['Nom']).'</td>';
      echo '<td>';
      echo '<select name="element'.$i.'" size="1" onChange="verif_liste(\'element'.$i.'\')" />';
      $j=1;
      echo '<option value=""> </option>';   /*Pour créer une valeur vide par défaut
      while ($j <= $NB_element)
         {
         echo '<option value="'.$j.'">'.$j.'</option>';
         $j++;
         }
      echo '</select>';
      echo '</td>';
      echo '</tr>';
      $i++;
      }


Jusque-là, ça va, j'ai écris un truc test dans ma fonction 'verif_liste()' pour voir si je récupérais bien mes infos, ça marche.
Mon problème étant de faire une boucle sur toute les liste autres que celle modifiée (passée en argument à la fonction) pour supprimer la valeur utilisée...

Clt,
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
>>...est-ce qu'il est possible, dans le cas d'un changement
>>de valeur dans une liste, de transmettre l'ancienne
>>valeur à une autre fonction pour remettre cette
>>valeur dans les autres listes ? ...
>>...un bouton pour réinitialiser les listes ?...
on peut tout... reste à programmer ces séquences !!

"moi" , je ferais le "contraire"
au lieu d'une liste de classement à chaque élément,
mettre une liste d'éléments à classer

au lieu de
question 1 ~ <select>1 ou 2 ou 3</select>
question 2 ~ <select>1 ou 2 ou 3</select>
question 3 ~ <select>1 ou 2 ou 3</select>
je ferais
<select>
question 1
question 2
question 3</select>
et donner la possibilité de "classer"
les options ( inverser 2 à 2 ) c'est
assez simple à réaliser
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Sinon, j'ai peut-être une idée !?

Créer 2 tableaux de variables :
- 1 contenant toutes les valeurs possibles du classement.
- 1 autre contenant toutes les valeurs déjà utilisées.
Supprimer les options des listes
Puis refaire les listes en fonction des 2 tableaux.

Pour le moment, je créé bien mes 2 tableaux correctement (vérifié).
Je bloque pour supprimer les options des listes, j'ai essayé pleins de trucs, mais en vain ...
this.form.element1.options.length=0;

this.form.elements['element1'].options.length=0;


... je n'arrive pas a atteindre l'attribut 'length' de mes select
<form name="classement" method="post" action".......">
   <select name="element1" size="1" onChange="verif_liste()">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
   </select>
   <select name="element2" size="1" onChange="verif_liste()">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
   </select>
   <select name="element3" size="1" onChange="verif_liste()">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
   </select>
</form>

...voilà, par exemple, dans le formulaire ci-dessus, comment je peux faire pour atteindre les éléments 'length' de mes listes ?

Merci
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
document.classement.element1.length ou 2 ou 3
mais le problème n'est pas trop là !!
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
par contre si c'est "tester" tous les select
mettez le même name pour tous les select
( toto par exemple ), vous pourrez faire une boucle
for ( var n=0; n<document.toto.length; n ++ )
{ document.toto[n].length c'est le nombre d'options
mais bon... le plus gros des soucis
n'est pas là non plus !
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Bon, ça commence a prendre forme ...
je livrerai mes sources quand ça fonctionnera définitivement.

Maintenant, je bloque sur un truc qui me parait tout bête mais j'dois être encore plus bête parceque je ne comprends pas...

A un endroit dans ma fonction JS, j'ai :
y=1;
while ( y<=<?php echo $NB_elements ?> )
   {
   utilisees[y]=(document.getElementsByName('element'+y)[0].value);
   y++;
   }

qui fonctionne très bien, je récupère bien les valeurs selectionnées dans mes différents <select>.

Par contre, la boucle suivante, qui n'est pas si différente que ça de celle ci-dessus, ne fonctionne pas :
x=1;
   while ( x<=<?php echo $NB_joueurs ?> )
      {
      document.classement.'element'+x.options.length=null;
      x++;
      }


alors que le code suivant fonctionne très bien :
document.classement.element3.options.length=null;

Cela me supprime bien toutes les options de ma liste name="element3", mon but étant de faire une boucle pour supprimer toutes les options de toutes les listes...

Merci d'avance.
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

J'ai trouvé un truc sur un autre forum qui semble avoir fonctionné pour la personne qui a posté ...
i=1;
while ( i<=10 )
   {
   tmp = 'element' + i;
   document.form.tmp.options.length=null;
   i++;
   }


Sauf que ça marche pas chez moi
Please HELP
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

Helloooo
Bon, pas sans peine, voici une "bonne ébauche" de quelque chose qui "fonctionne" mais qui peut être totalement amélioré

Notamment un dernier bug et pas des moindre : Quand je sélectionne la dernière valeur possible, eh bien la fonction s'exécute sur le OnChange="", et là, c'est le drame, mes listes sont vides (ce qui est normal) mais il ne ré-attribue pas les valeurs déjà sélectionnées (c'est à dire 'toutes')

Éclaire-moi une dernière fois, Bul, stp
Merci d'avance


function verif_liste()
   {
   var places=new Array;		
   var utilisees=new Array;
   var NBelement=<?php echo $NB_elements ?>
   // Un tableau bêtâ 1,2,3,.. autant qu'il y a d'élément à classer
   // de premier indice 1 (pour éviter les décalages d'index (enfin je crois)
   z=1;
   while ( z<=NBelement )
      {
      places[z]=z;
      z++;
      }
   // Un autre tableau dans lequel est stocké la valeur actuelle de chaque élément
   // de premier indice 1 également.
   y=1;
   while ( y<=NBelement )
      {
      utilisees[y]=(document.getElementsByName('element'+y)[0].value);
      y++;
      }
   // Ensuite on vide toutes les listes de chaque élément !
   x=1;
   while ( x<=NBelement )
      {
      document.getElementsByName('element'+x)[0].length=null;
      x++;
      }
   // Puis on scan dans un premier temps chaque valeur du tableau contenant les valeurs déjà attribuées (utilisees)
   for ( i=1; i < utilisees.length; i++)
      {
      // Un seconde scan du tableau contenant toutes les valeurs possibles
      for ( j=1; j < places.length; j++)
         {
         // Et si les deux valeurs sont identiques,
         // on la supprime (fonction splice) des valeurs possibles >> le tableau 'places' devient le tableau des places restantes et non plus le tableau de toutes les places possibles !!
         if ( utilisees[i] == places[j] )
            {
            places.splice(j,1);
            }
         }
      }
   // On créé une première boucle sur chaque élément
   w=1;
   while (document.classement["element"+w])
      {
      // Une seconde sur le tableau des 'places restantes'
      for ( k=1; k < places.length; k++)
         {
         // Si une valeur existe alors on ajoute une option à la liste.
         if (typeof places[k] != "undefined")
            {
            document.classement["element"+w].options[k] = new Option(places[k],places[k]);
            }
         }
      w++;
      }
   // Enfin, on fait une nouvelle boucle sur chaque element
   // pour ré-attribuer les valeurs déjà sélectionnées.
   w=1;
   while (document.classement["element"+w])
      {
      document.classement["element"+w].options[0].text=utilisees[w];
      w++;
      }
   }
Messages postés
20
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
26 octobre 2009

UP Bul3 ?
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
le but du jeu était de classer dans
l'ordre des préférences non ? si je me
souviens bien....
ça m'a inspiré cela : PC
le mieux (?) de toute manière c'est de n'utiliser
qu'un seul select et d'y classer les options,
qu'elle que soit la manière de le faire....
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
quand je disais un seul select, il fallait
comprendre une seule liste. dans l'exemple
mis, c'est un tableau.