2009-10-14 4 views
3

Je dois appliquer un jQuery.click uniquement aux éléments de premier niveau. Comment je fais ça?Comment puis-je appliquer jQuery.click uniquement aux éléments de premier niveau?

Voici ma liste:

<ul id="adminMenu"> 
    <li id="A"> 
    <h3><a href="">Item 1</a></h3> 
    </li> 
    <li id="B"> 
    <h3>Item 2</h3> 
    <ul style="display: block;"> 
     <li id="a1"> Sub Item 1 </li> 
     <li id="a2"> Sub Item 2 </li> 
     <li id="a3"> Sub Item 3 </li> 
    </ul> 
    </li> 
    <li id="C"> 
    <h3>Item 3</h3> 
    <ul style="display: none;"> 
     <li> Sub Item 4 </li> 
     <li> Sub Item 5 </li> 
    </ul> 
    </li> 
</ul> 

Et voici le jQuery

jQuery('#adminMenu > li').click(function(){ 
    alert('test'); 
}); 

MISE À JOUR
L'alerte devrait pas feu lorsque je clique sur un élément sous menu, uniquement lorsque Je clique sur la liste A, B ou C.

SOLUTION 1
Ce code est basé sur la suggestion de Marcels.

jQuery('#adminMenu > li > h3').click(function(e) { 
    var activeUL = jQuery("#adminMenu > li ul:visible"); 
    var activeLI = jQuery("#adminMenu > li ul:visible").parent('li:first'); 
    var clicked = jQuery(this).parent('li:first'); 
    // Close submenu 
    activeUL.hide('fast'); 
    // Open submenu 
    if(activeLI.attr('id') != clicked.attr('id'))   
     clicked.children('ul').show('fast'); 
    }); 

SOLUTION 2
C'est le code de travail basé sur la suggestion de Paupières.

jQuery('#adminMenu > li').click(function(e) { 
     var clicked = jQuery(e.target); 
     // Ensure we're checking which list item is clicked, 
     // other children should be allowed 
     if(!clicked.is('li') && clicked.parents('li').length > 0) { 
      // :first ensures we do not select higher level list items 
      clicked = clicked.parents('li:first'); 
     } 
     // If clicked list item is a child of another list item, we'll exit here 
     if(!clicked.is('#adminMenu > li')) { 
      return; 
     } 
    var activeUL = jQuery("#adminMenu > li ul:visible"); 
    var activeLI = jQuery("#adminMenu > li ul:visible").parent('li:first'); 

    // Close submenu 
    activeUL.hide('fast'); 
    // Open submenu 
    if(activeLI.attr('id') != clicked.attr('id'))   
     clicked.children('ul').show('fast'); 
    }); 

Merci les gars! Je n'aurais jamais réussi ça sans ton aide! :)

+1

En ce qui concerne la mise à jour 2: oui, ce qui est la raison pour laquelle vous aurez besoin de détecter si les sous-éléments ont été cliqués. Cliquez sur les événements "bulle", ce qui signifie qu'un événement click sur un élément enfant est également un événement click sur ses éléments parents. Le moyen le plus simple d'inter-navigateur * pour arrêter ces bulles et isoler les clics sur les parents est de déterminer si un élément enfant a déclenché l'événement click et de quitter dans ce cas. Voir ma réponse mise à jour pour la mise en œuvre de cette méthode. * Note: Les navigateurs non-IE permettent de "capturer" des événements (plutôt que de "bouillonner"), mais comme cela n'est pas supporté par IE, cela ne vaut pas la peine de s'y fier. – eyelidlessness

Répondre

5
jQuery('#adminMenu > li').click(function(e) { 
    var clicked = jQuery(e.target); 
    // Ensure we're checking which list item is clicked, 
    // other children should be allowed 
    if(!clicked.is('li') && clicked.parents('li').length > 0) { 
     // :first ensures we do not select higher level list items 
     clicked = clicked.parents('li:first'); 
    } 
    // If clicked list item is a child of another list item, we'll exit here 
    if(!clicked.is('#adminMenu > li')) { 
     return; 
    } 
    alert('test'); 
}); 

Mise à jour pour quitter si un élément de liste est cliqué pas un descendant immédiat de #adminMenu.

+0

Ce n'était que du fautes de frappe ici. J'ai mis à jour le code maintenant. – Steven

+0

Le code ci-dessus, sera également déclencher l'alerte lorsque je clique sur un sous-élément. – Steven

+0

Si le code que vous avez ne fonctionne toujours pas comme vous le souhaitez, pouvez-vous clarifier la question? Voulez-vous que le gestionnaire d'événements ignore les clics sur les éléments de la liste d'enfants? – eyelidlessness

-1
jQuery('#adminMenu li:first'). 
+1

Si je ne me trompe pas, cela n'appliquera que le .click au premier élément li. Je dois l'appliquer à TOUS les éléments li de premier niveau. – Steven

+0

-1 Ceci sélectionnera le premier élément li correspondant. Ce n'est pas la même chose que de sélectionner tous les éléments li de premier niveau. –

+0

@PragneshChauhan. Vous n'avez clairement pas lu la question! cela répond à la question! (mais c'est faux) il ne devrait pas être supprimé à moins que le Sergey décide de le faire. – gdoron

3

Le problème est que vous ajoutez le clic à l'ensemble LI (qui comprend tous les enfants, etc). Vous devez « clickify » les étiquettes seulement, utilisez donc:

jQuery("#adminMenu > li > h3").click(...); 
+0

C'est le premier. Mais il est appliqué à mes sous-éléments. Un clic sur le sous-élément 1 déclenche également l'alerte. – Steven

+0

Oui, m'a pris un certain temps pour saisir le problème;) Essayez le nouveau. –

+0

+1 Vous me battez pour ça. Upvoted pour utiliser moins de code. – MikeWyatt

0

obtenir un ensemble d'éléments contenant tous les enfants immédiats uniques de chacun de l'ensemble assorti d'éléments.

enfants ([expr])

http://docs.jquery.com/Traversing/children

jQuery('#adminMenu').children('li').children('h3').click(function() 
    { 
     alert('test'); 
    }); 
+0

Nope. Cela déclenchera également l'alerte lorsque je clique sur le sous-élément 1. – Steven

+0

Édité après clarification de la question (j'ai peut-être été un mauvais lecteur :) –

+0

La différence est que ("#adminMenu> li> h3") doit correspondre à "tous les sous-éléments , pas seulement les enfants immédiats, donc vous ne devriez pas avoir de clics sur "h3" se faire virer sur les sous-éléments de "h3" si je l'ai fait correctement. (en faisant l'hypothèse que vous "pourriez" avoir un "h3" à l'intérieur du li interne aussi) –

Questions connexes