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 :

Menu déroulant js non intrusif


Sujet :

JavaScript

  1. #1
    Membre chevronné
    Avatar de ilood
    Inscrit en
    Mars 2005
    Messages
    468
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 468
    Par défaut Menu déroulant js non intrusif
    Bonjour,

    J'aimerai créer un menu déroulant sans à avoir à modifier le code html ci-dessous. J'ai commencé un code js mais je n'arrive pas à récupérer le numéro du menu sur lequel la souris passe.
    Avez-vous une idée ? Un exmple ?
    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
    <div id="menu">
        <dl>
            <dt>Titre 1</dt>
            <dd>
                <ul>
                    <li>item 1</li>
                    <li>item 2</li>
                    <li>item 3</li>
                </ul>
            </dd>
        </dl>
        <dl>
            <dt>Titre 2</dt>
            <dd>
                <ul>
                    <li>item 1</li>
                    <li>item 2</li>
                    <li>item 3</li>
                </ul>
            </dd>
        </dl>
    </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
    <script type="text/javascript">
    var PAGE = function(){
    	return {
    		addLoadEvent : function(e) {
    			if (window.addEventListener)
    	 			window.addEventListener('load', e, false);
    	  		else if (window.attachEvent)
    				window.attachEvent('onload', e);
    		},
    		menu : function(){
    			return {
    				init : function(){
    					this.deplie();
    				},
    				deplie : function(){
    					var _menu = document.getElementById('menu');
    					var _dls = _menu.getElementsByTagName('dl');
    					var _dt = new Array();
    					for(var i=0;i<_dls.length;i++){
    						var _dts = _dls[i].getElementsByTagName('dt');
    						_dt.push(_dts[0]);
    					}
    					for(var i=0;i<_dt.length;i++){
    						_dt[i].onmouseover = function(){
    							alert('Hello '+i);
    						}
    					}
    				}
    			}
    		}()
    	}
    }();
     
    PAGE.addLoadEvent(function(){
    	PAGE.menu.init();
    });</script>

  2. #2
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _dt[i].onmouseover = function(i) {
        return function() { alert('Hello '+i); }
    }(i);
    Un peu de théorie ici

  3. #3
    Membre chevronné
    Avatar de ilood
    Inscrit en
    Mars 2005
    Messages
    468
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 468
    Par défaut
    Citation Envoyé par marcha Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _dt[i].onmouseover = function(i) {
        return function() { alert('Hello '+i); }
    }(i);
    Effectivement lorsque la page est chargé j'ai bien deux alertes avec les i bien incrémentés.
    Mais au survol des menus je n'ai plus d'alerte.

    Le but est qu'au survol du menu je puisse récupérer son numéro. Le but final étant d'afficher un sous menu.

  4. #4
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     function(i) {
        return function() { alert('Hello '+i); }
    }(i);
    et non pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     function(i) {
        alert('Hello '+i);
    }(i);
    ?

  5. #5
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Parce qu'en écrivant ca, tu exécutes la fonction immédiatement ^^

  6. #6
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    ha vi n'avais point vu le param (i) planqué :p

  7. #7
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Citation Envoyé par ilood Voir le message
    Effectivement lorsque la page est chargé j'ai bien deux alertes avec les i bien incrémentés.
    Mais au survol des menus je n'ai plus d'alerte.
    Tu peux reposter ton code actuel ?

  8. #8
    Membre chevronné
    Avatar de ilood
    Inscrit en
    Mars 2005
    Messages
    468
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 468
    Par défaut
    Citation Envoyé par marcha Voir le message
    Tu peux reposter ton code actuel ?
    Au temps pour moi, je n'avais pas vu le return devant la fonction.
    Ca fonctionne maintenant.

    Je vais essayer de progresser avec ces éléments.

    Merci

  9. #9
    Membre chevronné
    Avatar de ilood
    Inscrit en
    Mars 2005
    Messages
    468
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 468
    Par défaut
    J'ai réussi à obtenir ce que je souhaitais.

    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
    var PAGE = function(){
    	return {
    		addLoadEvent : function(e) {
    			if (window.addEventListener)
    	 			window.addEventListener('load', e, false);
    	  		else if (window.attachEvent)
    				window.attachEvent('onload', e);
    		},
    		menu : function(){
    			return {
    				init : function(){
    					this.deplie();
    				},
    				deplie : function(){
    					var _menu = document.getElementById('menu');
    					var _dls = _menu.getElementsByTagName('dl');
    					var _dt = new Array(); var _dd = new Array();
    					for(var i=0;i<_dls.length;i++){
    						var _dts = _dls[i].getElementsByTagName('dt');
    						var _dds = _dls[i].getElementsByTagName('dd');
    						_dt.push(_dts[0]);
    						_dd.push(_dds[0]);
    					}
    					for(var i=0;i<_dt.length;i++){
    						_dt[i].onmouseover = function(i){
    							return function(){
    								_dd[i].style.display = 'block';
    								_dd[i].onmouseover = function(i){
    									return function(){
    										_dd[i].style.display = 'block';
    									}
    								}(i);
    							}
    						}(i);
    						_dt[i].onmouseout = function(i){
    							return function(){
    								_dd[i].style.display = 'none';
    								_dd[i].onmouseout = function(i){
    									return function(){
    										_dd[i].style.display = 'none';
    									}
    								}(i);
    							}
    						}(i);
    					}
    				}
    			}
    		}()
    	}
    }();
    Il y a peut-être des optimisations d'écriture, si vous souhaitez y participer, j'en prendrai note avec plaisir.

  10. #10
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    quelques optimisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var i=0;i<_dls.length;i++
    en
    var i = 0 , l = _dls.length ; i < l ; i++
    évite d'avoir a recalculer la taille du tableu a chaque boucle :)
    je te conseillerais également d'utiliser un tableau a plusieurs dimension mais bon après c'est chacun ses préférences de code.

    pour le reste ça va ...

  11. #11
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var _dt = new Array(); var _dd = new Array();
    // plus simplement:
    var _dt = [], _dd = [];

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

Discussions similaires

  1. Menu déroulant / invisible ou non
    Par Invité dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 08/11/2011, 16h29
  2. menu déroulant CSS : FF OK Opera OK Chrome NON
    Par charlene44 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 21/12/2010, 22h04
  3. Menu déroulant largeur non fixée
    Par samtheh dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 30/09/2009, 16h02
  4. [ZF 1.7] [Element_Select] Menu déroulant non rempli
    Par Deallyra dans le forum Zend_Form
    Réponses: 6
    Dernier message: 18/05/2009, 17h36
  5. Menu déroulant, non déroulant sous IE :@
    Par PuppeT mAsTer dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 14/06/2006, 11h24

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