jQuery动态地将类添加到嵌套列表项以标记具有子节点的菜单

时间:2011-12-16 13:06:09

标签: jquery

下面的标记是动态生成的菜单的示例,该菜单使用css作为弹出框设置样式。我只是想添加箭头来显示菜单中有子菜单的位置。

是否有可能通过jQuery将一个类(“hasChild top”)添加到具有子菜单的顶级元素和一个类(“hasChild sub”)到具有子元素的低级元素?

<ul id="menu-site-menu">
    <li"><a href="#">About Us</a>
        <ul class="sub-menu">
            <li><a href="#">Our Charity Partners</a></li>
            <li><a href="#">Privacy Policy</a></li>
        </ul>
    </li>
    <li><a href="#">Buy Apparel</a>
        <ul class="sub-menu">
            <li><a href="#">Benevolent Elephant</a>
                <ul class="sub-menu">
                    <li><a href="#">Benevolent Elephant Short Sleeve</a></li>
                    <li><a href="#">Benevolent Elephant Long Sleeve</a></li>
                </ul>
            </li>
            <li><a href="#">Eagle-Spirit</a>
                <ul class="sub-menu">
                    <li><a href="#">Eagle-Spirit Short Sleeve</a></li>
                    <li><a href="#">Eagle-Spirit Long Sleeve T-Shirts</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">Customer Service</a></li>
    <li><a href="#">Contact Us</a></li>
</ul>

因此。在这个例子中,jQuery会将“hasChild top”类添加到“About Us”和“Buy Apparel”

它会将“hasChild sub”类添加到“Benevolent Elephant”和“Eagle Spirit”中

5 个答案:

答案 0 :(得分:2)

var topLevel = $("ul.nav.menu > li").has("ul");
topLevel.addClass("hasChild top");
topLevel.find("li").has("ul").addClass("hasChild sub");

也就是说,找到作为顶级ul的直接后代的li元素,然后使用.has()将其缩小到仅包含子ul的那些元素。给他们“hasChild顶级”课程。然后,在那些顶级的内部使用.find().has()结合使用以获得所有较低级菜单(无论嵌套程度如何)并为其提供“hasChild sub”类。

答案 1 :(得分:1)

这样的事可能会很好。

$('ul.nav.menu > li').each(function (index) {
    if ($(this).find('ul').length > 0) $(this).addClass('hasChild').addClass('top');
});

$('ul.nav.menu > li > ul > li').each(function (index) {
    if ($(this).find('ul').length > 0) $(this).addClass('hasChild').addClass('sub');
});

答案 2 :(得分:0)

$('ul.nav.menu > li > ul > li').each(function { 
    if ($(this).find('ul').length > 0) $(this).addClass('hasChild').addClass('sub'); 
    else 
     $(this).closest('li').addClass('hasChild').addClass('top'); 

}); 

答案 3 :(得分:0)

不确定它是否是最好的jquery,但这应该可以解决问题:

  $('.menu > li').each(function() {
        var childMenu = $(this).find('ul');
        if (childMenu.length > 0) {
            $(this).addClass('hasChild top');

            var subMenuChild = $('.hasChild.top > ul > li');
            $(subMenuChild).each(function() {
                var subMenuChildMenu = $(this).find('ul');
                if (subMenuChildMenu.length > 0) {
                    $(this).addClass('hasChild sub');
                }
            });
        }
    }); 

答案 4 :(得分:0)

我遇到了类似的问题,我想我的答案就在这里。

首先,我有一个弹出式嵌套列表,从托管服务中输出为.hasChildren。 所以,我只能在UL中添加类,这些工作正常。

我要做的是。将span类添加到.hasChildren(不添加类) 我已经尝试了上面的一些代码,并且它继续将span类附加到列表的末尾 - 请参阅下面我想要以粗体显示的内容。

最初我是这样做的

$(document).ready(function()
{
$('li.hasChildren a').first().append('<span class="arrow"></span>');

$('ul ul li.hasChildren a')。first()。append(''); });

它有效,但我有嵌套列表,有些列表会在不同时间有多个嵌套,因为网站可以在CMS的管理员中动态添加页面 - 所以我不能只使用.first

这就是我想要实现的目标

<li class="hasChildren"><a href="/about-us" class="">About Us<span class="arrow"></span></a></li>

以下是来自CMS的输出代码:

<ul class="globalMenu sf-menu responsive-menu sf-js-enabled">
   <li class="selectedPage"><a href="/" class="selectedPage">Home</a></li>
   <li class="hasChildren"><a href="/about-us" class="">About Us</a>
         <ul class="level2" style="display: none;">
                 <li><a href="/our-team">Our Team</a></li>
                 <li class="hasChildren"><a href="/campaigns" class="">Campaigns</a>
                          <ul class="level3" style="display: none;">
                                   <li><a href="/beat-poverty">Beat Poverty</a></li>
                         </ul>
                  </li>
          </ul>
    </li>
<li><a href="/events">Events</a></li>
<li><a href="/how-to-help">how to help</a></li>

P.S。 我喜欢页面结构可以随时更改的长度。 CK

更新:

通过以上所有代码,这就是我提出的工作原理。 唯一可能是好的方法是通过所有嵌套列表计算,而不是为每个列表添加另一个(或用逗号分隔)。让我知道是否有更简单的方法,或者这是我最简单的方法。

$('ul.globalMenu > li.hasChildren > a').append('<span class="arrow"></span>');

$('ul.globalMenu&gt; li.hasChildren ul li.hasChildren&gt; a')。append('');