For et while dans une même fonction

Résolu
Masterkic Messages postés 3 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 2 février 2010 - 27 janv. 2010 à 23:08
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 - 2 févr. 2010 à 20:50
Bonjour a tous,

voici mon idée: j'ai fait une fonction javascript qui en théorie me permet de suprimé dynamiquement dans une page html "une option" qui se retrouve dans plusieur select identique ex: je choisi "2" dans le premier select et l'option "2" se suprime dans chacun de tout mes autres select de la page dans le deuxieme je choisis "8" et l'option ayant la valeur "8" se suprime de tout les select. Le but de l'exercise ici est de crée plusieur select et de ne jamais avoir deux select avec la même option de selectionne en meme temps.

Voici mon code :
function seloptq(choice){
var choiceid = choice.id;
for (var q = 1; q <= 15; q++){
var check = 'q'+q;
var optlist=document.getElementById(check);
var optlength=optlist.options.length
if (choiceid !== check){
var myselect=document.getElementById(check);
var i = 0;
while (i <= optlength){
var cvalue = myselect.options[i].value;
var choose = choice.value;
if (choose == cvalue){
alert (i+" "+check);
myselect.remove(i);
}
i++;
}
}
}
}


Voici mon problème : La boucle "for" pour q fonctionne elle se rend jusqu'au while... le while s'execute une premiere fois tout va bien jusqu'a se que while se termine... alors la je m'attendais à ce que q ++ augment de 1 et que le for recommence sa boucle pour réexecuter le while jusqu'a ce que le for atteigne sa valeur maximal c'est a dire 15, mais il arrete tout à la premiere "loop". PS: Je suis amateur alors désoler si mon code à l'air de rien.

Merci beaucoup a ceux qui pourront me donner des pistes de solution !

5 réponses

PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
2 févr. 2010 à 19:04
Bonjour,
un petit rappel qui me semble utile
- l'index du premier élément d'un tableau commence à 0 et non à 1
- la longueur d'un tableau est égale au nombre d'éléments de celui ci, MAIS le dernier élément d'un tableau n'a pas pour index longueur_tableau mais longueur_tableau -1.
Exemple :
T_Valeur[0] = 1;
T_Valeur[1] = 2;
T_Valeur[2] = 3;
T_Valeur[3] = 4;
...etc...
T_Valeur[9] = 10;
si je veux afficher le dernier élément il me faut écrire
var T_Longueur = T_Valeur.length; // qui sera égal à 10, 10 éléments stockés dans T_Valeur
Affiche(T_Valeur[T_Longueur -1]); // accès à la 10éme case soit l'index 9

Bon tout cela pour en arrivé au fait que quand tu écris i < = optlength, il y a déjà faute car en aucun cas i doit être égal à optlength, dans ce cas ton script se mettra en erreur pour élément undefined, i doit rester INFERIEUR à optlength.

Ceci étant dit, lorsque tu supprimes une OPTION, tu te trouves dans le même cas de débordement, la console d'erreur doit d'ailleurs t'informer d'une erreur.

Voilà pour résumer il me semble normal que le 1st for et la boucle while se fasse jusqu'au bout avant de planter le script...

Exemple qu'aurait pu être ta fonction
//---------------------------
function Remove_Option( obj_){
  var O_Ref = obj_;
  var num = 1;
  //-- utilisation de la méthode while pour ne pas avoir
  //-- a modifier le code en cas de changement du nombre de SELECT
  while( O_Test = document.getElementById( "q" + num++)){  
    if( O_Test != O_Ref){
      //-- utilisation de .length car peut être modifiée en dynamique   
      for( var i = 0; i < O_Test.options.length; i++){
        //-- Test de value
        if( O_Test.options[i].value == O_Ref.value){
          alert( i +" " +O_Test.id);
          O_Test.remove(i);
          // NOTA si l'on est sur qu'il n'y a pas d'autre élément dans le
          // SELECT à supprimer on peut mettre un break qui met fin à la boucle
          break;
          // dans le cas contraire 
          i--;  // réajustement du compteur
        }
      }
    }
  }
}

Voila à toi de jouer...
;O)
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
28 janv. 2010 à 18:52
Bonjour,
1/ pourquoi utiliser un WHILE pour ta boucle imbriquée et non pas un FOR
2/ ATTENTION, tu écris var optlength=optlist.options.length, mais quand tu en supprime une optlength reste identique mais pas la valeur qu'elle est prétendue représenter, optlist.options.length est dynamiquement modifiée.
;O)
0
Masterkic Messages postés 3 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 2 février 2010
1 févr. 2010 à 20:10
1- J'ai modifier mon code afin d'utiliser un for et non pas un while et cela ma donné exactement le même résultat. J'avais utilisé le while pour je me souviens plus quelle raison.

2- Maintenant le 2e point que tu apportes me semble vrai, mais je ne comprends pas en quoi cela pourrait faire en sorte que le script ne s'exécute pas comme je le veux voici mon raisonnement.

Si optlength "16" lorsque "q 1" alors "i" ne devrait pas dépasser 16. Maintenant lorsque la 2e boucle for se termine (i = 16) pour la première fois alors normalement "q" devrait incrémenter de 1 pour qu'ainsi "q = 2" alors la optlength redevient "16" puisque optlength est calculer avec les options du select avec le nom "q2" et ainsi de suite jusqu'a ce que q = 15 puisque j'ai 15 select de q1 a q15. (16 étant un nombre x mais qui correspond au nombre d'option de chaque select au départ)

La valeur optlength devrait être 15 uniquement si les 2 boucles se terminent dans leur ensemble sauf pour 1 des selects c'est-à-dire celui de départ auquel la fonction a fait référence la premiere fois, mais dans mon cas la première boucle n'est exécuter qu'une seule fois. Et puis même si optlength a la même valeur tout au long de la fonction ça ne devrait pas altérer mon résultat cela n'est qu'une sécurité pour empêcher que la boucle continue à l'infini et donc dans mon cas elle s'arrete si (i <= au maximum d'option possible).

Tout cela n'est que ma facon de raisonner je suis possiblement complètement en dehors de la traque et c'est pour cela que je vous remercie de m'aider !
0
Masterkic Messages postés 3 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 20:20
Cela a tellement l'air facile pour vous, merci enormément! Je vais tenter d'apprendre de mon erreur plutot que de copier le code (qui fonctionne cela dit) et de ne pas comprendre ce qui est ecris. Excellent merci encore!
0

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

Posez votre question
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
2 févr. 2010 à 20:50
Cela a tellement l'air facile pour vous,
cela le deviendra vite pour toi, si tu t'en donnes la peine...

J'ai omis de signaler que si tu mets un break pour stopper la boucle dans ce cas tu peux utiliser un variable initialisée avec la longueur du tableau, évitant ainsi l'évaluation à chaque itération.
    if( O_Test != O_Ref){
      //-- utilisation d'une variable initialisée
      var Nbr = O_Test.options.length;
      for( var i = 0; i < Nbr; i++){
        if( O_Test.options[i].value == O_Ref.value){
          alert( i +" " +O_Test.id);
          O_Test.remove(i);
          break;
        }
      }
    }

;O)
0
Rejoignez-nous