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 :

Ajout d'un 'setTimeout' sur menu déroulant


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut Ajout d'un 'setTimeout' sur menu déroulant
    Bonsoir bonsoir,

    Je voudrais ajouter une fonction de timeout sur le menu horizontal1 de la galerie CSS de developpez.net.
    Le timeout devra permettre de garder le menu déroulé 1 ou 2s avant de se fermer.

    Je pense qu'il faut ajouter un setTimeout dans le javascipt qui suit mais j'arrive pas a utiliser cette fonction :

    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
     
    //au chargement de la page, on appelle la fonction montre()
    window.onload=montre;
     
     
    //affichage du menu déroulant et placement de ce dernier
    function montre(id,affiche)
    {
    	var d = document.getElementById(id);
    	//si on quitte un élément du menu
    	if (d && !affiche) 
    	{
    		d.style.display='none'; //on l'efface
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV')  //si c'est un sous-menu, on rend à son parent les couleurs d'origine
    		{
    			c.firstChild.style.color='#39f';
    			c.firstChild.style.background='#fff';
    		}
    	}
    	//sinon si on se mets sur un élément du menu
    	else if (d && affiche)
    	{
    		d.style.display='block'; //on l'affiche
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV') //si c'est un sous-menu, on donne à son parent les couleurs de survol
    		{
    			c.firstChild.style.color='#fff';
    			c.firstChild.style.background='#39f';
    		}
     
    	}
    }
    Merci d'avance de votre aide

  2. #2
    Membre expérimenté Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Par défaut
    Une idée (non testé)
    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
     
    function montre(id,affiche)
    {
    	var d = document.getElementById(id);
    	//si on quitte un élément du menu
    	if (d && !affiche) 
    	{
    	  //on va ajouter une propriété à l'élément à masquer
    	  // et on va appeler la méthode de manière récursive
        if(!d.timeoutid) {
          // 1er appel : on affecte la propriété
          // et on fait le timeout (ici 2 seconde)
          d.timeoutid = window.setTimeout("montre('" + id + "', false)", 2000);
          // puis on sort
          return;
        } else {
          // second appel, c'est en principe l'appel du setTimeout, 2s plus tard
          //  on initialise la propriété pour les affichage ultérieur
          d.timeoutid = null;
        }
        // on continue le traitement qui va masquer le menu
    		d.style.display='none'; //on l'efface
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV')  //si c'est un sous-menu, on rend à son parent les couleurs d'origine
    		{
    			c.firstChild.style.color='#39f';
    			c.firstChild.style.background='#fff';
    		}
    	}
    	//sinon si on se mets sur un élément du menu
    	else if (d && affiche)
    	{
    		d.style.display='block'; //on l'affiche
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV') //si c'est un sous-menu, on donne à son parent les couleurs de survol
    		{
    			c.firstChild.style.color='#fff';
    			c.firstChild.style.background='#39f';
    		}
     
    	}
    }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut
    Merci,

    Ca marche pas mal sauf que le timer se déclenche lorsque je déroulle le menu et non pas lorsque je le quitte. Du coup, si je laisse le curseur sur le menu déroulé, il disparait quand même....

  4. #4
    Membre expérimenté Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Par défaut
    Ca marche pas mal sauf que le timer se déclenche lorsque je déroulle le menu et non pas lorsque je le quitte. Du coup, si je laisse le curseur sur le menu déroulé, il disparait quand même....
    Ok je vois, mais c'est un chouilla plus compliqué

    Tu dois avoir dans le menu un appel de la fonction, sur un évènement onmouseover ou onclick, qui affiche le bloc menu.
    Il faut donc que tu ajoutes dans le menu un evenement onmouseout, qui lui va cacher le menu après un timeout.
    je fait une légère modification du code.
    l'ouverture du menu ne change pas
    par contre pour le fermture avec un timeout il faut ajouté le onmouseout.
    Repere dans le menu le onclick / onmouseover, fait le même appel, en ajoutant un 3emme paramétré: TRUE (c'est ce 3emme param qui indique le différé)
    ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div onmouseover="montre(quelquechoe, true)" onmouseout="montre(quelquechoe, false, true)">
    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
     
    function montre(id,affiche, differe)
    {
    	var d = document.getElementById(id);
    	//si on quitte un élément du menu
    	if (d && !affiche) 
    	{
    	  //on va ajouter une propriété à l'élément à masquer
    	  // et on va appeler la méthode de manière récursive
        if(!d.timeoutid && differe) {
          // 1er appel : on affecte la propriété
          // et on fait le timeout (ici 2 seconde)
          d.timeoutid = window.setTimeout("montre('" + id + "', false)", 2000);
          // puis on sort
          return;
        } else {
          // second appel, c'est en principe l'appel du setTimeout, 2s plus tard
          //  on initialise la propriété pour les affichage ultérieur
          d.timeoutid = null;
        }
        // on continue le traitement qui va masquer le menu
    		d.style.display='none'; //on l'efface
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV')  //si c'est un sous-menu, on rend à son parent les couleurs d'origine
    		{
    			c.firstChild.style.color='#39f';
    			c.firstChild.style.background='#fff';
    		}
    	}
    	//sinon si on se mets sur un élément du menu
    	else if (d && affiche)
    	{
    		d.style.display='block'; //on l'affiche
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV') //si c'est un sous-menu, on donne à son parent les couleurs de survol
    		{
    			c.firstChild.style.color='#fff';
    			c.firstChild.style.background='#39f';
    		}
     
    	}
    }
    en espérant que j'ai été suffisamment claire

  5. #5
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Il suffit de changer très legement la fonction montre() :
    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
     
    //au chargement de la page, on appelle la fonction montre()
    window.onload=montre;
     
     
    //affichage du menu déroulant et placement de ce dernier
    function montre(id,affiche)
    {
    	var d = document.getElementById(id);
    	//si on quitte un élément du menu
    	if (d && !affiche) 
    	{
    		var cache = function() {
    			d.style.display='none'; //on l'efface
    			var c=d.parentNode; //son parent
    			if (c.parentNode.parentNode.parentNode.tagName!='DIV')  //si c'est un sous-menu, on rend à son parent les couleurs d'origine
    			{
    				c.firstChild.style.color='#39f';
    				c.firstChild.style.background='#fff';
    			}
    		};
    		windows.setTimeout(cache, 1000);
    	}
    	//sinon si on se mets sur un élément du menu
    	else if (d && affiche)
    	{
    		d.style.display='block'; //on l'affiche
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV') //si c'est un sous-menu, on donne à son parent les couleurs de survol
    		{
    			c.firstChild.style.color='#fff';
    			c.firstChild.style.background='#39f';
    		}
     
    	}
    }
    Normalement, a coup de closures, ça devrait marcher comme ça. Sinon, il faut créer une fonction cache avec tous les paramètres et lui passer ces paramètres.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut
    Super Cdenis
    Il manquait juste un clearTimeout à l'affichage.

    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
     
    function montre(id,affiche)
    {
    	var d = document.getElementById(id);
    	//si on quitte un élément du menu
    	if (d && !affiche) 
    	{
    		var cache = function() {
    			d.style.display='none'; //on l'efface
    			var c=d.parentNode; //son parent
    			if (c.parentNode.parentNode.parentNode.tagName!='DIV')  //si c'est un sous-menu, on rend à son parent les couleurs d'origine
    			{
    				c.firstChild.style.color='#39f';
    				c.firstChild.style.background='#fff';
    			}
    		};
    		d.timeoutid = window.setTimeout(cache, 1000);
    	}
    	//sinon si on se mets sur un élément du menu
    	else if (d && affiche)
    	{
    		clearTimeout(d.timeoutid);
    		d.style.display='block'; //on l'affiche
    		var c=d.parentNode; //son parent
    		if (c.parentNode.parentNode.parentNode.tagName!='DIV') //si c'est un sous-menu, on donne à son parent les couleurs de survol
    		{
    			c.firstChild.style.color='#fff';
    			c.firstChild.style.background='#39f';
    		}
     
    	}
    }
    Merci à tous les deux de votre aide.

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

Discussions similaires

  1. Détection hover sur menu déroulant
    Par Parojo dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/04/2010, 08h34
  2. Ajouter des séparateurs dans un menu déroulant
    Par Nafoute dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/10/2008, 10h07
  3. pb sur menu déroulant
    Par BillTornade2b dans le forum Flash
    Réponses: 6
    Dernier message: 03/04/2007, 14h12
  4. Problème sur menu déroulant selon requête
    Par Lola21 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 30/06/2006, 11h05
  5. PB lien sur menu déroulant en HTML
    Par usull dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2006, 15h47

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