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 :

Récupérer la valeur de l'enfant du n-ième parent, simplification possible ? [UI]


Sujet :

jQuery

  1. #1
    Membre éprouvé
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2014
    Messages : 92
    Par défaut Récupérer la valeur de l'enfant du n-ième parent, simplification possible ?
    Bonjour,

    Comme l'indique le titre je cherche à simplifier mon Javascript qui récupére la valeur de l'enfant du n-ième parent.

    Voici ma structure (accordion jquery ui) :
    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
    <div id="accordion">
    	<h3><a href="#">PHOTOS</a><span><img src="" alt="" title=""></span></h3>
    	<div>
    		<div>...</div>
    		<div>
    			<button>Récupère ma valeur (PHOTOS)</button>
    		</div>
    	</div>
     
    	<h3><a href="#">VIDEOS</a><span><img src="" alt="" title=""></span></h3>
    	<div>
    		<div>...</div>
    		<div>
    			<button>Récupère ma valeur (VIDEOS)</button>
    		</div>
    	</div>
    </div>

    J'arrive à récupérer le texte en faisant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $('button').click(function() {
    	var ancetre = $(this).parent().parent().parent();
    	alert($(ancetre).children('h3').find('a').html());
    });
    Mais je pense qu'il doit y avoir plus simple.

    Si vous avez des pistes, n'hésitez pas à partager

    Tcho

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    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 : 54
    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
    Si je comprends ta demande, tu cherches à partir des balises <button> à remonter de deux <div>, trouver le <h3> précédent et obtenir le contenu du lien qui s'y trouve, c'est ça ?

    Si c'est ça, ta méthode n'est effectivement pas idéale puisque déjà, tu remontes un cran trop haut (div#accordion) et du coup, tu perds le rang de l'élément cliqué.
    Tu as différentes solutions selon moi.
    1) Ajouter une classe commune aux div suivant les <h3>, par exemple "ref" :
    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
    <div id="accordion">
    	<h3><a href="#">PHOTOS</a><span><img src="" alt="" title=""></span></h3>
    	<div class="ref">
    		<div>...</div>
    		<div>
    			<button>Récupère ma valeur (PHOTOS)</button>
    		</div>
    	</div>
     
    	<h3><a href="#">VIDEOS</a><span><img src="" alt="" title=""></span></h3>
    	<div class="ref">
    		<div>...</div>
    		<div>
    			<button>Récupère ma valeur (VIDEOS)</button>
    		</div>
    	</div>
    </div>
    tu peux ensuite remonter directement jusqu'à celle qui correspond au bouton, puis retrouver les autres éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $('button').click(function() {
        console.log($(this).closest('.ref').prev('h3').find('a').html());
    }
    mais bon, comme tu le vois, ça reste assez lourd comme syntaxe...

    Le mieux serait, si c'est possible, d'utiliser les attributs data-*. Tu pourras soit indiquer sur chaque bouton son rang par exemple :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <button data-rang="0">Récupère ma valeur (PHOTOS)</button>
    et utiliser cette info pour retrouver plus facilement le bon lien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $('button').click(function() {
        console.log($('#accordion h3 a').eq($(this.data('rang')).html());
    }
    ou mieux, ajouter une classe ou un id correspondant au rang en question :
    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
    <div id="accordion">
    	<h3><a href="#" id="lien0">PHOTOS</a><span><img src="" alt="" title=""></span></h3>
    	<div>
    		<div>...</div>
    		<div>
    			<button data-lien="lien0">Récupère ma valeur (PHOTOS)</button>
    		</div>
    	</div>
     
    	<h3><a href="#" id="lien1">VIDEOS</a><span><img src="" alt="" title=""></span></h3>
    	<div>
    		<div>...</div>
    		<div>
    			<button data-lien="lien1">Récupère ma valeur (VIDEOS)</button>
    		</div>
    	</div>
    </div>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $('button').click(function() {
        console.log($('#' + $(this.data('lien')).html());
    }
    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

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2014
    Messages : 92
    Par défaut
    Merci pour vos réponses.

    @Bovino : tu as très bien cerné le problème. Je reviens juste sur le premier point que tu soulève, je devais bien remonter de trois parents pour ensuite aller dans le h3. Ou alors nous ne comptons pas à partir de la même origine ?

    @SpaceFrog
    : je ne saisis pas le sens de .parents('div:eq(1)'). Tu peux m'en dire plus sur cette notation ?

    J'opte pour la solution n°2 (date-*) de Bovino qui est plus propre. Je n'avais pas pensé à un système de ce genre.

    Encore merci à vous trois.


    Edit : @Bovino : il y a une petite coquille dans la syntaxe de récupération, c'est : $('#' + $(this).data('lien')).html() au lieu de $('#' + $(this.data('lien')).html()

  6. #6
    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 : 54
    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
    je devais bien remonter de trois parents pour ensuite aller dans le h3
    Bah... ça dépend (ça dépasse, forcément ).
    Depuis le bouton, tu remontes d'un niveau pour atteindre la div englobant le bouton, d'un deuxième niveau pour atteindre la div qui se situe après le titre h3 et si tu remontes d'un troisième niveau, tu atteins la div #accordion et là, tu perds la position du bouton cliqué.
    Donc en remontant de deux niveaux puis en cherchant le h3 précédent, c'est plus efficace.
    Enfin, en tout état de cause, l'utilisation de data-* me semble beaucoup plus appropriée et jQuery facilite grandement leur utilisation.

    EDIT : oui, bien vu la coquille !
    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

  7. #7
    Membre éprouvé
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2014
    Messages : 92
    Par défaut
    Ok, je comprends mieux pourquoi il faut remonter de deux et non de trois. C'est noté.

    Merci.

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    .parents('div:eq(1)')
    parents remonte la hierarchie des tags selon le selecteur
    je remonte donc la hierarchie des divs et je prends le second div parent eq(1) ( eq(0) étant le premier )
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

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

Discussions similaires

  1. récupérer les valeurs d'un formulaire mdi enfant
    Par p1xl_01 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/05/2010, 11h26
  2. [C#-XML] Récupérer les valeurs des noeuds enfants
    Par cyllix dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/06/2006, 11h54
  3. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45
  4. [Couleur] Récupérer les valeurs R,V,B et L,U,V ?
    Par M4v3rick dans le forum C++Builder
    Réponses: 4
    Dernier message: 25/01/2004, 03h28
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28

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