Reputation: 37
Pretty simple problem here, but it's been bugging me a bit.
I've got an accordion menu set up like so:
<ul id="menu" class="navigation">
<li><a href="#"><span>Dashboard</span></a>
<ul>
<li><a href="#">Dashboard</a></li>
<li><a href="#">Articles & Posts</a></li>
<li><a href="#">Pages</a></li>
</ul>
</li>
<li><a href="#"><span class="icon_articles">Articles & Posts</span></a>
<ul>
<li><a href="#">Dashboard</a></li>
<li><a href="#">Articles & Posts</a></li>
<li><a href="#">Pages</a></li>
</ul>
</li>
<li><a href="#"><span class="icon_pages">Pages</span></a></li>
<li><a href="#"><span class="icon_media">Media Gallery</span></a>
<ul>
<li><a href="#">Dashboard</a></li>
<li><a href="#">Articles & Posts</a></li>
<li><a href="#">Pages</a></li>
</ul>
</li>
<li><a href="#"><span class="icon_calendar">Calendar</span></a></li>
<li><a href="#"><span class="icon_demos">Features & Demos</span></a>
<ul>
<li><a href="#">Dashboard</a></li>
<li><a href="#">Articles & Posts</a></li>
<li><a href="#">Pages</a></li>
</ul>
</li>
<li><a href="#"><span class="icon_settings">Settings</span></a></li>
<li><a href="#"><span class="icon_logout">Logout</span></a></li>
</ul>
And I've got a jQuery script that runs the accordion:
function accordionMenu() {
$('ul.navigation ul').hide();
$('ul.navigation li a').click(
function() {
var parentElement = this.parentNode.parentNode.id;
var elementTest = $(this).next();
if((elementTest.is('ul')) && (elementTest.is(':visible'))) {
$('#' + parentElement + ' ul:visible').slideUp('fast');
$(this).removeClass('active');
return false;
}
if((elementTest.is('ul')) && (!elementTest.is(':visible'))) {
$('#' + parentElement + ' ul:visible').slideUp('fast');
elementTest.slideDown('fast');
$('ul.navigation a').removeClass('active');
$(this).addClass('active');
return false;
}
}
);
}
$(document).ready(function() {accordionMenu();});
Now I need to figure out how to loop through the list items, and find the ones that have lists following them (ie, the ones that when clicked, drop down to reveal the hidden list.). Then I need to add a span on the end of each one (inbetween </a> and <ul>). That's it really. It's just confusing me - how should I go about doing it?
Thanks,
Alex
Upvotes: 2
Views: 4014
Reputation: 991
$('ul.navigation').children().has("ul").each(function(){
$(this).children("a").append("<span>test</span>");
});
this should work :) good luck with your project.
Upvotes: 1
Reputation: 69915
You can try this.
$('ul.navigation li').filter(function(){
return $(this).children('ul').length > 0;
}).each(function(){
$(this).find('a').after('<spam />');
})
.addClass('className');
Upvotes: 1
Reputation: 95047
The :has selector is perfect for this scenario.
$("#menu li:has(ul)").addClass("hasSubMenu");
Upvotes: 1
Reputation: 2870
$("#menu ul").each(function(){
$(this).closest("li").addClass("whatever_class_you_need")
.find("a").first().after("<span>something goes here</span>");
});
Upvotes: 1