2010-01-13 5 views
2

Je construis un menu déroulant simple où je voudrais ajouter une classe parent si existe UL:addClass si ul existe (jQuery)

HTML:

<ul id="menu"> 
    <li><a href="#">Parent 1</a></li> 
    <li><a href="#">Parent 2</a> 
    <ul> 
     <li><a href="#">Sub 2.1</a></li> 
     <li><a href="#">Sub 2.2</a></li> 
    </ul> 
    </li> 
</ul> 

J'aimerais à:

  • cacher toutes imbriquées (ul#menu > li > ul) ul de départ
  • Afficher/Masquer imbriqué ul sur vol stationnaire
  • addClass "menu déroulant" aux parents qui ont niché ul de

Ce ne fonctionne pas tout à fait, ne sais pas pourquoi:

$(function() { 
    $("ul#menu li").hover(function() { 
     $(this).addClass("hover"); 
     $('ul:first', this).css('visibility', 'visible'); 
    }, 
    function() { 
     $(this).removeClass("hover"); 
     $('ul:first', this).css('visibility', 'hidden'); 
    }); 
    $("ul#menu li ul li:has(ul)").find("a:first").addClass("dropdown"); 
}); 

Un grand merci pour votre aide!

Répondre

2
var ul = $('#menu'); 

if (ul.length) { 
    ul.children('li').hover(function() { 
     $(this).children('ul').show(); 
    }, function() { 
     $(this).children('ul').hide(); 
    }).children('ul').hide().parent().addClass('dropdown'); 
} 

Démo: http://jsbin.com/ofayu

BTW: vous fermez les balises <li> correctement dans votre balisage.

+0

Parfait, merci! :) – 3zzy

0

Ce devrait faire l'affaire (non testé):

$('ul#menu > li > ul').each(function() 
{ 
    var list = $(this); 
    list.hide(); 
    list.parent().hover(list.hide, list.show); 
    list.parent().parent().addClass('dropdown'); 
}); 
+0

Vous ne pouvez pas passer la souris sur un élément caché. –

+0

Bon appel; Je suppose que le vol stationnaire doit être sur l'élément de la liste. –

1

Vous avez écrit:

$("ul#menu li ul li:has(ul)") 

Compte tenu de votre structure HTML, ne devrait pas être ce:

$("ul#menu li:has(ul)")