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

jQuery Discussion :

Ajout de tableau et exécution


Sujet :

jQuery

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut Ajout de tableau et exécution
    Bonjour à tous,
    J'ai besoin de vos lumières pour comprendre un problème.
    J'ai adapter un menu acordéon avec jQuery.

    Mon code js est le suivant :
    Code JS : 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
     
    // JavaScript Document
     
    $(document).ready( function () { 
     
        // On cache les sous-menus : 
        //$(".navigation ul.subNavigation").hide(); 
    	// sauf celui qui porte la classe "open_at_load" : 
        $("ul.objectName ul.objectDescription:not('.open')").hide(); 
     
    	// et on remplace l'élément span qu'ils contiennent par un lien : 
    /*    
    	$(".navigation li.level1 span").each( function () { 
           // On stocke le contenu du span : 
            var TexteSpan = $(this).text(); 
            $(this).replaceWith('<a href="#" title="Afficher le sous-menu">' + TexteSpan + '<\/a>') ; 
        } ) ; 
    	// On modifie l'évènement "click" sur les liens dans les items de liste 
        // qui portent la classe "toggleSubMenu" : 
      
    */  
      $("ul.objectName li.level1 > a").click( function () { 
            // Si le sous-menu était déjà ouvert, on le referme : 
            if ($(this).next("ul.objectName ul.objectDescription:visible").length != 0) { 
                $(this).next("ul.objectName ul.objectDescription").slideUp("normal", function () { $(this).parent().removeClass("open");$(this).parent().addClass("close") }); 
            } 
            // Si le sous-menu est caché, on ferme les autres et on l'affiche : 
            else { 
                $("ul.objectName ul.objectDescription").slideUp("normal", function () { $(this).parent().removeClass("open");$(this).parent().addClass("close") }); 
                $(this).next("ul.objectName ul.objectDescription").slideDown("normal", function () { $(this).parent().removeClass("close");$(this).parent().addClass("open") }); 
            } 
            // On empêche le navigateur de suivre le lien : 
            return false; 
        });
    } ) ;

    et mon de html / PHP est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    echo '<ul class="objectName"><li class="level1">';
    echo '<a href="#">tt</a>';
     
    echo '<table><tr><td>hh</td></tr></table>';
     
    echo '<ul class="objectDescription close"><li>';
    echo '<div>test</div>';
    echo '</li></ul></li></ul>';
    ?>
    Ce que je ne comprends pas pourqoi ca fonction quand je commente cette ligne
    #echo '<table><tr><td>hh</td></tr></table>';
    Si je la décommentre, le <ul class="objectDescription close"> ne se développe pas alors qu'il se développe normalement quand la ligne, ci-dessus , est commentée!!!

    Avez vous une idée pourquoi le table a une infuance?
    Ne serait-il pas un problème de DOM?

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Par défaut
    Hello pierrot10,

    L'ajout d'élément après ton tag 'a', empêche une sélection correcte de <ul class="objectDescription close"> via la méthode next("...").

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    ok , mais alors comment perfectionner ce code alors?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Par défaut
    A mon avis la solution la plus simple consiste à utiliser nextAll() et en ne prenant que le premier.

    next() retourne le tag frère (sibling) suivant respectant le sélecteur s'il est précisé. Dans ton cas, le tag frère suivant est le tag 'table' qui ne respecte pas le sélecteur?

    nextAll() retourne tous les tag frère (sibling) suivant respectant le sélecteur s'il est précisé. Dans ton cas, on ne prendra que le premier de ces tags frères.

    Voici ce que ça donne en reprennant ton code (au passage, je ne l'ai pas essayé !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      $("ul.objectName li.level1 > a").click( function () { 
            // Si le sous-menu était déjà ouvert, on le referme : 
            if ($(this).nextAll("ul.objectName ul.objectDescription:visible").length != 0) { 
                $(this).nextAll("ul.objectName ul.objectDescription")[0].slideUp("normal", function () { $(this).parent().removeClass("open");$(this).parent().addClass("close") }); 
            } 
            // Si le sous-menu est caché, on ferme les autres et on l'affiche : 
            else { 
                $("ul.objectName ul.objectDescription").slideUp("normal", function () { $(this).parent().removeClass("open");$(this).parent().addClass("close") }); 
                $(this).nextAll("ul.objectName ul.objectDescription")[0].slideDown("normal", function () { $(this).parent().removeClass("close");$(this).parent().addClass("open") }); 
            } 
            // On empêche le navigateur de suivre le lien : 
            return false; 
        });

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Salut Sedryk,

    Merci pour ta réponse. En fait ta solution est de remplacé tout les next() par nextAll().

    Je l'ai fait mais ca n'a malheureusement pas résolu le problème. Ca ne change pas

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    En fait ta solution est de remplacé tout les next() par nextAll().
    En oubliant pas de sélectionner uniquement le premier élément. Sinon peux-tu me fournir le code html que ton php génère ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Voilà le code exact:
    Il diffpre a celui ci-dessus, car j'ai voulu donné la version simplifié, mais le problème est identique:
    Code HTML : 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
     
    <div class="objectName">
    	<table class="cal">
    		<tbody>
    			<tr>
    				<td class="cal-row-name object">
    					<a href="index.php">Object No : 1</a>
    				</td>
    				<td class="days">1</td>
    				<td class="days">2</td>
    				<td class="days">3</td>
    				/..
    				28 autres cellules
    				../
    				<td class="days">31</td>
    			</tr>
    		</tbody>
    	</table>
    	<div class="objectDescription open">
    		<div>test</div>
    	</div>
    </div>
    <div class="objectName">
    	<table class="cal">
    		<tbody>
    			<tr>
    				<td class="cal-row-name object">
    					<a href="index.php">Object No : 2</a>
    				</td>
    				<td class="days">1</td>
    				<td class="days">2</td>
    				<td class="days">3</td>
    				/..
    				28 autres cellules
    				../
    				<td class="days">31</td>
    			</tr>
    		</tbody>
    	</table>
    	<div class="objectDescription open">
    		<div>test</div>
    	</div>
    </div>
    <div class="objectName">
    	<table class="cal">
    		<tbody>
    			<tr>
    				<td class="cal-row-name object">
    					<a href="index.php">Object No : 3</a>
    				</td>
    				<td class="days">1</td>
    				<td class="days">2</td>
    				<td class="days">3</td>
    				/..
    				28 autres cellules
    				../
    				<td class="days">31</td>
    			</tr>
    		</tbody>
    	</table>
    	<div class="objectDescription open">
    		<div>test</div>
    	</div>
    </div>
    5 ou 8 autres objectName
    <div class="objectDescription open"> est la partie qui se cache ou qui s'ouvre quand on clique sur le lien "Object No x". Attention, quand je clique sur Object No 1, il doit que développé lqu'un "objectDescription". Celui qui se trouve dans la meme layer appelé "objectName".
    Code js : 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
     
    // JavaScript Document
     
    $(document).ready( function () { 
     
        // On cache les sous-menus : 
        //$(".navigation ul.subNavigation").hide(); 
    	// sauf celui qui porte la classe "open_at_load" : 
        $("div.objectName div.objectDescription:not('.open')").hide(); 
     
    	// et on remplace l'élément span qu'ils contiennent par un lien : 
     
    /*
    	$(".navigation li.level1 span").each( function () { 
           // On stocke le contenu du span : 
            var TexteSpan = $(this).text(); 
            $(this).replaceWith('<a href="#" title="Afficher le sous-menu">' + TexteSpan + '<\/a>') ; 
        } ) ; 
    */
     
    // On modifie l'évènement "click" sur les liens dans les items de liste 
    // qui portent la classe "toggleSubMenu" :   
      $("div.objectName table.cal tr td.cal-row-name > a").click( function () { 
            // Si le sous-menu était déjà ouvert, on le referme : 
            if ($(this).nextAll("div.objectName div.objectDescription:visible").length != 0) { 
                $(this).nextAll("div.objectName div.objectDescription").slideUp("normal", function () { $(this).parent().removeClass("open");$(this).parent().addClass("close") }); 
            } 
            // Si le sous-menu est caché, on ferme les autres et on l'affiche : 
            else { 
                $("div.objectName div.objectDescription").slideUp("normal", function () { $(this).parent().removeClass("open");$(this).parent().addClass("close") }); 
                $(this).nextAll("div.objectName div.objectDescription").slideDown("normal", function () { $(this).parent().removeClass("close");$(this).parent().addClass("open") }); 
            } 
            // On empêche le navigateur de suivre le lien : 
            return false; 
        });
    } ) ;

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Par défaut
    Ca diffère quand même pas mal, ton lien est en faite dans le tableau. Comme je te l'ai précisé les fonctions next travaille avec les tags frères, c'est à dire avec les tags qui se trouve dans le même parent. Dans ton cas, ce n'est pas étonnant que ça ne fonctionne pas, ton tag 'a' est dans une td et n'a pas de frère donc next ou nextAll ne retourne rien d'où le faite que ton code ne fonctionne pas !

    Je vais regarder d'un peu plus prêt !

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Par défaut
    Je suis parti du principe que la partie qui doit s'ouvrir et se fermer est celle contenue dans les div 'objectDescription'. Peux-tu tester le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $("div.objectName table.cal tr td.cal-row-name > a").click( function () { 
            // Si le sous-menu était déjà ouvert, on le referme : 
            var sousMenu = $(this).closet("div.objectName");
            if (sousMenu.nextAll("div.objectDescription:visible").length != 0) {
            	sousMenu.nextAll("div.objectDescription").slideUp("normal", function () { $(this).removeClass("open");$(this).addClass("close") });
            } 
            // Si le sous-menu est caché, on ferme les autres et on l'affiche : 
            else { 
                $("div.objectName div.objectDescription").slideUp("normal", function () { $(this).removeClass("open");$(this).addClass("close") }); 
                sousMenu.nextAll("div.objectDescription").slideDown("normal", function () { $(this).removeClass("close");$(this).addClass("open") }); 
            } 
            // On empêche le navigateur de suivre le lien : 
            return false; 
        });

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Salur Sedryc,

    Je te remcie pour ta réponse,
    J'ai très trsè vite essayé car je suis sur le point de partir en vacances 1 semaine.
    Ca pas l'air de marché,
    Je pense qu'il y a un problème au niveau de
    var sousMenu = $(this).closet("div.objectName");
    (j'ai aussi eyssayé sans le t de closet)

    et l'error console de Firefox me retourne que ce n'est pas une fonction
    Error: $(this).closet is not a function
    Source File: http://localhost/eBooking/js/jQuery/menu-accordeon2.js
    Line: 46
    En tout cas merci pour ton aide

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Par défaut
    une erreur de ma part il faut plutôt mettre closest et non closet

  12. #12
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par sedryk Voir le message
    une erreur de ma part il faut plutôt mettre closest et non closet
    Oui, on est bien d'accord que l'erreur vient de toi qui crache du code et non pas de celui qui copie colle sans même regarder si une faute de frappe à pu se glisser alors qu'il a quand même réussi à isoler la ligne problématique, tu es vraiment impardonnable

    Bref, c'était mon coup de gueule
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout de tableau à la fin d'un tableau
    Par TobyKaos dans le forum C
    Réponses: 25
    Dernier message: 12/09/2007, 15h13
  2. [Débutant] Ajout JAR externe : pb exécution
    Par arthix dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 15/01/2007, 22h35
  3. [Tableaux] Ajout dans tableau associatif
    Par bizet dans le forum Langage
    Réponses: 3
    Dernier message: 15/10/2006, 10h57
  4. Ajouter Fichiers Ressources en exécution
    Par bandit boy dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/06/2006, 09h00
  5. [CR 9.1] comment faire pour ajouter un tableau dans un état?
    Par anneso108 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 28/03/2006, 14h40

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