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 :

Cacher/afficher un div


Sujet :

jQuery

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Cacher/afficher un div
    Bonjour à tous et merci à ceux qui prendront le temps de me répondre.

    Voilà mon souci du jour.
    J'ai cette séquence en JS qui me permet d'afficher un div par un effet de slide.
    Il y en à 3, activables chacun par un bouton.

    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
    <script type="text/javascript">
    		$(document).ready(  function()
    			{$('.panelLink').click(function()
                   { if ($('#slide_panellogin').is(':hidden'))
                        {
                           $('#slide_panellogin').slideDown('slow');
                           }
                            else
                               {
                               $('#slide_panellogin').slideUp('slow');
                               }
    						});
                        });
    		$(document).ready(  function()	
    			{$('.panelSearch').click(function()
                   { if ($('#slide_panelsearch').is(':hidden'))
                        {
                           $('#slide_panelsearch').slideDown('slow');
                           }
                            else
                               {
                               $('#slide_panelsearch').slideUp('slow');
                               }
    						});
                        });
    		$(document).ready(  function()	
    			{$('.panelAccount').click(function()
                   { if ($('#slide_panelaccount').is(':hidden'))
                        {
                           $('#slide_panelaccount').slideDown('slow');
                           }
                            else
                               {
                               $('#slide_panelaccount').slideUp('slow');
                               }
    						});
                        });
    ;
    Mon souci est que ceux-ci ne remontent pas lorsque l'on choisi de clicker sur un autre de ses slides ou de clicker sur un endroit vide de la page.

    De plus il me semble que l'on pourrait concaténer ce code pour n'avoir qu'une fonction regroupant les trois mais je ne voit pas comment procéder.

    Vous le constaterez je ne suis pas doué en JS.

    Merci à ceux qui pourront m'apporter une solution.
    Des explications éventuelles seront bienvenues.

  2. #2
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    Procédons par étapes :

    1/ tu n'as besoin que d'une seule structure DOMready :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <script type="text/javascript">
    $(document).ready(function(){
     
    });
    </script>
    2/ Pour factoriser il faut peut-être un peu modifier tes élements, en conservant ce que tu utilises déjà voici ce que je te propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <a class="panelLink panelOpener" id="slide_panellogin_opener">...</a>
    <a class="panelSearch panelOpener" id="slide_panelsearch_opener">...</a>
    <a class="panelAccount panelOpener" id="slide_panelaccount_opener">...</a>
    ...
    <div class="panel" id="slide_panellogin">...</div>
    <div class="panel" id="slide_panelsearch">...</div>
    <div class="panel" id="slide_panelaccount">...</div>
    Si la class panelOpener des liens peut te suffir tu peux supprimer les class spécifiques.

    3/ Quand on clique sur un des liens tu veux ouvrir le panel associé, ou le fermer s'il était ouvert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
    $(document).ready(function(){
      $('.panelOpener').click(function(){
        var idPanel = $(this).attr('id').replace('_opener','');
        var $panel = $('#'+idPanel);
        var panelIsOpen = $panel.is(':visible');
        if(!panelIsOpen) $panel.slideDown('slow');
        else $panel.slideUp('slow');
      });
    });
    </script>
    4/ Si un autre panel était ouvert tu veux qu'il se ferme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
    $(document).ready(function(){
      $('.panelOpener').click(function(){
        var idPanel = $(this).attr('id').replace('_opener','');
        var $panel = $('#'+idPanel);
        var panelIsOpen = $panel.is(':visible');
        $('.panel').slideUp('slow');
        if(!panelIsOpen) $panel.slideDown('slow');
      });
    });
    </script>
    5/ Quand on clic n'importe où ailleurs tu veux que cela ferme les panels, ça se corse un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
    $(document).ready(function(){
      $('.panelOpener').click(function(){
        ...
      });
      $(document).click(function(event){
        if($(event.target).parents('.panel, .panelOpener').length == 0)
          $('.panel').slideUp('slow');
      });
    });
    </script>
    Si on clique dans le document mais qu'on est pas dans un des panel (ça évitera qu'ils ne se ferment alors que l'utilisateur cherche à les utiliser) ou sur un des liens (ça évite de traiter deux choses pour les mêmes éléments) : on ferme les panels.

  3. #3
    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 : 73
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Dans le même genre que ci-dessus, mais avec une écriture différente...

    Pour unifier les dénominations, j'ai changé la classe panelLink en panelLogin et j'ai corrigé les ID pour qu'il suive l'écriture de la classe : pas "slide_panellogin" mais "slide_panelLogin".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <a class="panelLogin" href="#">Show/hide Panel Login</a><br/>
    <div id="slide_panelLogin">I'm the Login panel</div>
    <a class="panelSearch" href="#">Show/hide Panel Search</a><br/>
    <div id="slide_panelSearch">I'm the Search panel</div>
    <a class="panelAccount" href="#">Show/hide Panel Account</a><br/>
    <div id="slide_panelAccount">I'm the Account panel</div>
    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
    <script>
    	$(function(){
    		var jObjDivSlide = $( "[id^='slide_panel']" );
     
    		jObjDivSlide.hide(); // cache toutes les divisions
     
    		/*
    		* Gestion du clic sur nos liens
    		*/
    		$( "a[class^='panel']" ).click( function( e ){
    			// la division
    			var jObj = $( "#slide_panel" + $( this ).attr( "class" ).slice( 5 ) );
     
    			// cache toutes les divisions sauf jObj
    			jObjDivSlide.each( function( i, item ){
    				if ( jObj[0] != item ){
    					$( item ).hide();
    				}
    			});
     
    			// cache ou montre la division
    			jObj.slideToggle( "slow" );
     
    			// stopper l'action par défaut et la transmission de l'événement
    			//return false;
     
    			// stopper uniquement la transmission de l'événement
                            e.stopPropagation();
    		});
     
    		// nécessaire pour la gestion du clic en dehors de
    		$( "[id^='slide_panel']" ).click( function(){
    			// stopper l'action par défaut et la transmission de l'événement
    			return false;
    		});
     
    		/*
    		* Gestion du click sur le document mais 
    		* en dehors de nos liens et de nos divisions
    		*/
    		$( "body" ).not( "a[class^='panel'], [id^='slide_panel']" ).click( function(){
    			jObjDivSlide.hide();
    		});
    	});
    </script>

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Presque au bout !
    Merci à tous les deux d'avoir consacrer un peu de temps pour mon problème.
    S'en est presque frustrant d’ailleurs car j'ai passé presque une semaine dessus avant de me résoudre à vous posez la question et vous me faites ça en quelques heures...
    Donc j'ai privilégié la première solution car plus explicite... en tous cas pour mon niveau de connaissance.
    Cependant il me reste un problème qui est que si je laisse la valeur de length à 0 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($(event.target).parents('.panel, .panelOpener').length == 0)
    les sliders s'abaissent bien lors du click mais remontent aussitot.
    Si je passe la valeur à 1 ca fonctionne presque. Je dit presque car lorsque l'on click ailleurs dans la page le slide est toujours visible.

    Merci.

  5. #5
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    Par défaut
    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
    $(document).ready(function(){
      $('.panelOpener').click(function(){
        var idPanel = $(this).attr('id').replace('_opener','');
        var $panel = $('#'+idPanel);
        var panelIsOpen = $panel.is(':visible');
        $('.panel:visible').slideUp('slow');
        if(!panelIsOpen) $panel.slideDown('slow');
        return false;
      });
      $(document).click(function(event){
        if(!$(event.target).is('.panel, .panelOpener') && $(event.target).parents('.panel, .panelOpener').length == 0)
          $('.panel:visible').slideUp('slow');
        return false;
      });
    });
    J'ai modifié un peu et j'ai surtout ajouté le test de savoir si l'élément cliqué sur le document n'est pas lui-même un panel ou un opener (avant de chercher à savoir si c'est un sous-élément)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Merci vraiment du coup de main...
    La dernière modif du code fonctionne parfaitement sur les slides et le fonctionnement que j'en attendais.
    Cependant il me revient un nouveau problème suite à cette modif ; les liens de mon menu ne fonctionnent plus du tout...
    Je te soumets le code de mon menu qui est en deux parties:
    * le premier est la partie standard du menu qui s'affiche sans conditions

    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
    <?php
        function affiche_menu()
        {
            // tableaux contenant les liens d'accès et le texte à afficher
            $tab_menu_lien = array( "home.php", "services.php", "account.php", "news.php", "#", "#" );
            $tab_menu_texte = array( "Home", "Services", "Account", "News", "Contact", "How to" );
     
            // informations sur la page
            $info = pathinfo($_SERVER['PHP_SELF']);
     
            $menu = "\n<div id=\"menu\">\n    <ul class=\"onglets\">\n";
     
     
     
            // boucle qui parcours les deux tableaux
            foreach($tab_menu_lien as $cle=>$lien)
            {
                $menu .= "    <li";
     
                // si le nom du fichier correspond à celui pointé par l'indice, alors on l'active
                if( $info['basename'] == $lien )
                    $menu .= " class=\"active\"";
     
                $menu .= "><a href=\"" . $lien . "\">" . $tab_menu_texte[$cle] . "</a></li>\n";
            }
     
            $menu .= "</ul>\n</div>";
     
            // on renvoie le code xHTML
            return $menu;        
        }
    	?>
    et l'appel de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
        require_once("./incl.menu.php");
            
        $menu = affiche_menu();
    ?>
    * la deuxième partie "incl.topmenu.php" qui dépend si l'utilisateur est connecté à son compte ou non et dans le quel on retrouve le code pour les slides

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<?php
                            if (isset($_SESSION['id']) && !empty($_SESSION["id"])) {  
                                    include ('incl.user_connected.php');
                            }
                                    else { 
                                            include ('incl.userbar.php');
                                    }
                    ?>
     
    			<div class="slide_panel" id="slide_panellogin">...</div>
    			<div class="slide_panel" id="slide_panelaccount">... </div>
    			<div class="slide_panel" id="slide_panelsearch">... </div>
    et l'appel de la fonction depuis le header
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include("incl.topmenu.php"); ?>
    Merci. Vraiment merci. Bon dimanche.

  7. #7
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    Par défaut
    Je pense que j'ai mis un return false en trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $(document).ready(function(){
      $('.panelOpener').click(function(){
        var idPanel = $(this).attr('id').replace('_opener','');
        var $panel = $('#'+idPanel);
        var panelIsOpen = $panel.is(':visible');
        $('.panel:visible').slideUp('slow');
        if(!panelIsOpen) $panel.slideDown('slow');
        return false;
      });
      $(document).click(function(event){
        if(!$(event.target).is('.panel, .panelOpener') && $(event.target).parents('.panel, .panelOpener').length == 0)
          $('.panel:visible').slideUp('slow');
      });
    });

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Comme disait oncle Benny... : "vachement super, vachement super"
    Merci infiniment pour le temps passé.

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

Discussions similaires

  1. Afficher une div au click et la cacher
    Par flashnet dans le forum jQuery
    Réponses: 2
    Dernier message: 03/04/2012, 15h44
  2. [osCommerce] Afficher/cacher contenu dans <div>
    Par mitiaa dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 04/02/2011, 19h00
  3. cacher / afficher des div en JSF
    Par Lourpiop dans le forum JSF
    Réponses: 13
    Dernier message: 07/05/2010, 11h19
  4. afficher un div et cacher tous les autres
    Par maysa dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 20/01/2010, 22h17
  5. Afficher un div et cacher l'autre aprés Click
    Par fabien14 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/12/2008, 12h45

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