Javascript 如何仅显示<;ul>;具有选定的<;李>;包括所有<;李>;在父ul中,而不仅仅是选定的?

Javascript 如何仅显示<;ul>;具有选定的<;李>;包括所有<;李>;在父ul中,而不仅仅是选定的?,javascript,jquery,css,Javascript,Jquery,Css,我已经阅读了很多文章,这些文章使用addClass()、parent()、closest()、filter()、CSS如何没有父选择器等等做了类似的事情,我进展很快,因此我非常感谢您的帮助。:-) 一些背景: 我有一个由CMS生成的无序列表,所以我不能添加或更改其中的任何类。我只能触摸CSS,我可以使用jQuery 当用户选择一个列表项时,CMS会向该列表项添加一类“selected”,并根据所选项目在菜单中的位置向上添加到该李的父母李、祖父母李等 我只能将这一无序列表用于显示在内部页面左侧的主

我已经阅读了很多文章,这些文章使用addClass()、parent()、closest()、filter()、CSS如何没有父选择器等等做了类似的事情,我进展很快,因此我非常感谢您的帮助。:-)

一些背景: 我有一个由CMS生成的无序列表,所以我不能添加或更改其中的任何类。我只能触摸CSS,我可以使用jQuery

当用户选择一个列表项时,CMS会向该列表项添加一类“selected”,并根据所选项目在菜单中的位置向上添加到该李的父母李、祖父母李等

我只能将这一无序列表用于显示在内部页面左侧的主导航和侧导航

我需要做的是: 在sidenav中,我只需要显示包含选定li的ul,包括父ul中的所有li,而不仅仅是选定的li。例如,如果我的菜单有两个部分,“关于我们”和“给予”,并且有人从“关于我们”部分中选择了一个页面,那么我只想显示“关于我们”部分,而不是“给予”部分。(稍后,我将向顶层li和用户选择的页面的li添加样式。)

我知道如何显示具有选定类别的li,但如果ul在其中任何位置有选定的li,我需要显示所有li。此外,我需要不显示列表中的任何其他ul,如果这些ul没有在其中选择li

这是我的HTML。在本例中,用户已转到“关于我们->我们的承诺”下的“策略”页面

<ul class="main-menu sm sm-simple">
    <li class="menuItem1 first parent selected"><a href="#">About Us</a>
        <ul class="nccUlMenuSub1">
            <li class="menuItem1 first parent selected"><a href="#">Our commitment</a>
                <ul class="nccUlMenuSub2">
                    <li class="menuItem1 first"><a href="#">Operating standards</a></li>
                    <li class="menuItem2 selected last"><a class="selected" href="#">Policies</a></li>
                </ul>
            </li>
            <li class="menuItem2 last"><a href="#">Annual Report</a></li>
        </ul>
    </li>
    <li class="menuItem2 last parent"><a href="#">Giving</a>
        <ul class="nccUlMenuSub1">
            <li class="menuItem1 first last"><a href="#">What your gift can do</a></li>
        </ul>
    </li>
</ul>
这应该可以:

$('li.selected').show();
$('li.selected').siblings('li:not(.parent)').show();
它将显示选定项目的所有同级列表项目

此外,您还有一些格式不正确的HTML,因此我想知道这是打字错误还是CMS实际输出的HTML无效:

<li class="menuItem2 last parent"><a href="#">Giving</a>  <!-- This -->
        <ul class="nccUlMenuSub1">

  • 这可能更符合您的需求

    $('li.selected').find('.selected').show(); //get all grandchilden
    $('li.selected').find('.selected').siblings().show(); // get all sibling except root
    
    find忽略根节点,因此不会显示“关于我们”的“兄弟”给予。此外,根据您的标记,您还需要标识一个子标记


    这听起来更像是CMS问题,而不是其他任何问题。谢谢,我会试试看!我认为HTML是好的;li没有关闭,因为它下面有子菜单(如果我理解你的意思的话)。下面是我最后使用的。兄弟姐妹()是关键!再次感谢<代码>$('#leftnav ul.main-menu li').hide()
    $('#leftnav ul.main-menu li.selected').show()
    $('#leftnav ul.主菜单
    li.selected')。同级('li:not(.parent')).show()谢谢,我会看看进展如何!