IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] listes en cascades


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut [AJAX] listes en cascades
    Bonjour à tous
    J'essaie à partir d'un tuto vu sur ce site de développer quelques chose qui comporterait 3 listes issues de tables différentes
    La première liste définit un crière pour la seconde et la seconde pour la 3ème.
    Une fois terminé, je voudrais pouvoir faire une requête utilisant les 3 sélect du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type select * from select1 where select2='select3"
    Voici le code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <head>
    		<title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
    		<script type='text/javascript'>
     
    			function getXhr(){
                                    var xhr = null; 
    				if(window.XMLHttpRequest) // Firefox et autres
    				   xhr = new XMLHttpRequest(); 
    				else if(window.ActiveXObject){ // Internet Explorer 
    				   try {
    			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
    			            } catch (e) {
    			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			            }
    				}
    				else { // XMLHttpRequest non supporté par le navigateur 
    				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    				   xhr = false; 
    				} 
                                    return xhr;
    			}
     
    			/**
    			* Méthode qui sera appelée sur le click du bouton
    			*/
    			function go(){
    				var xhr = getXhr();
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						leselect = xhr.responseText;
    						// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('livre').innerHTML = leselect;
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ajaxLivre.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				// ici, l'id de l'auteur
    				sel = document.getElementById('auteur');
    				id_groupe = sel.options[sel.selectedIndex].value;
    				xhr.send("id_groupe="+id_groupe);
    			}
    			function go2(){
    				var xhr = getXhr();
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						leselect = xhr.responseText;
    						// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('contenu').innerHTML = leselect;
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ajaxLivre2.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				// ici, l'id du groupe
    				sel = document.getElementById('livre');
    				id_contenu = sel.options[sel.selectedIndex].value;
    				xhr.send("id_contenu="+id_contenu);
    			}
    		</script>
    	</head>
    	<body>
            <form>
                <fieldset style="width: 800px">
                    <legend>Listes liées</legend>
                    <label>Formations</label>
                    <select name='auteur' id='auteur' onchange='go()'>
                        <option value='-1'>Aucun</option>
                        <?php require_once('Connections/perso.php'); ?>
                          <? mysql_select_db($database_perso, $perso);
                            $res = mysql_query("SELECT * FROM categories ORDER BY categorie");
                            while($row = mysql_fetch_assoc($res)){
                                echo "<option value='".$row["id_categorie"]."'>".$row["categorie"]."</option>";
                            }
                        ?>
                    </select>
                    <label>Groupes</label>
                    <div id='livre' style='display:inline'>
                    <select name='livre'onchange='go2()'>
    <option value='-1'>Aucun</option>
                    </select>
                    </div>
     <label>Contenu</label>
                    <div id='contenu' style='display:inline'>
                    <select name='contenu'>
                        <option value='-1'>Préciser la valeur</option>
                    </select>
                    </div>
                </fieldset>
            </form>
        </body>
    </html>
    puis pour le fichier ajxLivre.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php require_once('Connections/perso.php'); ?>
     
    <?php
    echo "<select name='livre'>";
    if(isset($_POST["id_groupe"])){
    mysql_select_db($database_perso, $perso);
     
    $res = mysql_query("SELECT id_groupe,groupe FROM groupes 
    WHERE id_categorie=".$_POST["id_groupe"]." ORDER BY groupe");
    while($row = mysql_fetch_assoc($res)){
    echo "<option value='".$row["id_groupe"]."'>".$row["groupe"]."</option>";
            }
        }
        echo "</select>";
    ?>
    et enfin ajaxLivre2.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php require_once('Connections/perso.php'); ?>
     
    <?php
    echo "<select name='contenu'>";
    if(isset($_POST["id_contenu"])){
    mysql_select_db($database_perso, $perso);
     
    $res = mysql_query("SELECT id_contenu,contenu FROM contenu
    WHERE id_groupe=".$_POST["id_contenu"]." ORDER BY contenu");
    while($row = mysql_fetch_assoc($res)){
    echo "<option value='".$row["id_contenu"]."'>".$row["contenu"]."</option>";
            }
        }
        echo "</select>";
    ?>
    Je précise que le passage de la liste 1 à la lkiste 2 fonctionne bien mais c'est après que ça coince, alors si quelqu'un a des idées, je l'en remercie par avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    c'est à dire ??

    1er pb à résoudre : remplissage du 3ème select ?
    2eme pb à résoudre : lancer une requête avec les options choisies dans les 3 select ?
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut
    Effectivement, le premier problème est le remplissage du 3ème sélect

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    peut-être une question de mise en cache...

    commence par remplacer dans go() et go2() :
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var xhr = false;
    var xhr = new getXhr();
    et dans getXhr() supprime :
    ensuite tu as peut être intéret à faire de tes deux fonctions go() et go2() une seule, et de gérer leurs différences avec des paramètres...

    tu aurais donc la fonction go(id_à_remplir,url,id_sélection)...
    base toi sur go() qui semble fonctionner, contrairement à go2()...

    tu peux également supprimer la ligne où tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leselect = xhr.responseText;
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut
    Bonsoir
    j'avance un peu : je peux faire un sélect sur les listes 1 et 2, la 3 se charge également voir ici : http://bridgeclub.briochin.free.fr/auteurs.php
    Lorsque je change les valeurs de la liste 2, celles de la 3 se mettent bien à jour par contre si je veux changer la 1, j'ai un pb sur la 2 : une liste vide apparaît - sans doute un pb de nomination de div ou de select mais je ne vois pas bien alors si quelqu'un a une idée, je suis preneur.
    Merci

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut
    Bonjour
    petit à patit j'avance, les listes se remplissent bien maintenant et se modifient correctement.
    Par contre j'aurais besoin qu'elles se vident en fonction des choix faits sur liste 1 ou 2...
    Je m'explique : je fais un choix sur liste 1 ==> j'ai des options proposés en liste 2
    Je fais ensuite un choix sur liste 2==> j'ai des options en liste 3
    Je reviens sur liste 1 : il faudrait alors que liste 3 se vide !

    Donc si quelqu'un a des idées pour cela

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    document.getElementById("id_liste_3").options.length = 1;
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut
    Bonjour
    Pour mieux comprendre où j'en suis, voilà le lien avec le chargement des listes qui fonctionne :
    http://bridgeclub.briochin.free.fr/recherche.php
    Quand je reviens faire un choix, il faut donc que les listes inutiles à droite disparaissent.
    Je me suis appuyé sur un script intéressant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    	{
    		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    		if(xhrcate.readyState == 4 && xhrcate.status == 200)
    		{
    			leselectcate = xhrcate.responseText;
    			// Ajouter les options a la liste via l'id du div
    			$idobjet('div_cate').innerHTML = leselectcate;
    		}
    	}
     
    	// Ici on va voir comment faire du post
    	xhrcate.open("POST","ajaxcategorie.php",true);
    	// ne pas oublier ça pour le post
    	xhrcate.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	// Poste les arguments le compte puis la mule via l'id du select
    	var selcpte = $idobjet('lst_cpte');
    	var cptesel = selcpte.options[selcpte.selectedIndex].value;
     
    	var selmule = $idobjet('lst_mule');
    	var mulesel = selmule.options[selmule.selectedIndex].value;
     
    	var seltype = $idobjet('lst_type');
    	var typesel = seltype.options[seltype.selectedIndex].value;
     
    	var datacate = "ddcpte="+cptesel+"&ddmule="+mulesel+"&ddtype="+typesel;
    	xhrcate.send(datacate);
    }
     
    /* Gestion de la liste déroulante des categories */
    function goobjet(obj)
    {
    	/* Cache le Div objet
    	   si option sélectionnée dans la liste déroulante des categories */		
     
     
    	var xhrobjet = getXhr();
    	// On défini ce qu'on va faire quand on aura la réponse
    	xhrobjet.onreadystatechange = function()
    	{
    		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    		if(xhrobjet.readyState == 4 && xhrobjet.status == 200)
    		{
    			leselectobj = xhrobjet.responseText;
    			// Ajouter les options a la liste via l'id du div
    			$idobjet('div_obj').innerHTML = leselectobj;
    		}
    	}			
    	// Ici on va voir comment faire du post
    	xhrobjet.open("POST","ajaxobj.php",true);
    	// ne pas oublier ça pour le post
    	xhrobjet.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	// Poste les arguments le compte puis la mule via l'id du select
    	var selcpte = $idobjet('lst_cpte');
    	var cptesel = selcpte.options[selcpte.selectedIndex].value;
     
    	var selmule = $idobjet('lst_mule');
    	var mulesel = selmule.options[selmule.selectedIndex].value;
     
    	var seltype = $idobjet('lst_type');
    	var typesel = seltype.options[seltype.selectedIndex].value;
     
    	var selcat = $idobjet('lst_cate');
    	var catesel = selcat.options[selcat.selectedIndex].value;
     
    	var dataobjet = "ddcpte="+cptesel+"&ddmule="+mulesel+"&ddtype="+typesel+"&ddcate="+catesel;
    	xhrobjet.send(dataobjet);
    }
     
    /* Par faignantise de frapper du code merci à d-Rek */
    function $idobjet(id)
    {
    	return document.getElementById(id);
    }
    mais je coince sur cette partie

  9. #9
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut Firebug
    Je te conseille de télécharger Firebug
    Cela t'aidera à diagnostiquer tes bugs javascript.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut
    Merci, je l'ai déjà
    Je précise qu'il n'y a pas de bug : c'est une amélioration du script que je recherche

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    soit tu encapsules chaque liste dans un div e et tu joues sur le display (ou avec le innerHTML), soit tu retires les éléments par le DOM ! mais étant donné que si tu modifies à nouveau ton choix il faudra les ré-afficher, je te conseille la première solution.
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 26
    Points
    26
    Par défaut même genre de problème
    Salut, j'ai un peu le même genre de problème a résoudre que toi et je vois que tu as réussi a avancer donc je me permet d'écrire dans ce post pour avoir la solution.

    Je suis en JSP avec des servlets et ajax, je veux faire 3 listes liées aussi et le problème est que lorsque je clique sur ma deuxième liste pour selectionné un element pour qu'il me remplisse ma troisième liste il me dit que ma selection est null en fait il ne trouve pas ma seconde liste, je voudrais donc savoir comment tu as fait pour résoudre ce problème

    merci d'avance

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 103
    Points
    103
    Par défaut
    Salut
    En fait, c'est le même principe pour passer d'une liste à la suivante. J'ai simplement modifié quelque chose que j'avais trouvé sur ce forum. Je te joins l'ensemble des fichiers que j'utilise.
    Le problème qui me reste à résoudre est celui de cacher les div qui sont à droite de celui dans lequel je refais une recherche. Par exemple lorsque je reviens choisir une formation dans le premier div, c'est désagréable de conserver le reste, d'autant que ça n'a plus rien à voir avec la recherche en cours.
    Bon courage
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [AJAX] liste deroulante ajax
    Par klimero dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 25/04/2006, 15h26
  2. [AJAX] listes deroulantes liées x3
    Par Tempotpo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/04/2006, 16h55
  3. [Hibernate] Pb avec List et cascade
    Par mauvais_karma dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/04/2006, 15h02
  4. Réponses: 7
    Dernier message: 21/03/2006, 23h01
  5. Réponses: 2
    Dernier message: 08/03/2006, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo