繁体   English   中英

折叠除单击的UL及其父UL之外的所有UL

[英]Collapse all ULs other than the clicked one and its parent ULs

我有一个带有嵌套UL的导航栏,如下所示。 我正在使用一个简单的类,并对其进行切换以隐藏菜单/子菜单:

nav ul ul {
    display: none;
}
.showIt {
    display: block;
}

在单击href为“#”的链接时,我尝试使用以下方法隐藏包含所单击项目的UL 之外的所有其他UL:

$("nav").on('click', "a[href='#']", function () {
    var $thisUl = $(this).next('ul');
    $('nav ul').not($thisUl).each(function () {
        if (!($.contains($(this), $thisUl)))
            $(this).removeClass('showIt');
    });
    $thisUl.toggleClass("showIt");
});

由于某种原因,此方法无法正常工作,因为它不会扩展所单击的子菜单。 实际上,它折叠了包含此子菜单的菜单。

这是供参考的导航结构:

<nav>
<ul class="navbar">
    <li>
        <a href="index.html">Home</a>
    </li>
    <li>
        <a href="newsletter.html">News/Hints &amp; Tips</a>
    </li>
    <li>
        <a href="#">Courses</a>
        <ul>
            <li>
                <a href="#">IT Courses</a>
                <ul>
                    <li><a href="courses/access-main.html">Access</a></li>
                    <li><a href="courses/excel-main.html">Excel</a></li>
                    <li><a href="courses/onenote-main.html">OneNote</a></li>
                    <li><a href="courses/outlook-main.html">Outlook</a></li>
                </ul>
            </li>
            <li>
                <a href="#">Microsoft Certified</a>
                <ul>
                    <li><a href="ms-certified-courses/mos-main.html">Microsoft Office Specialist(MOS)</a></li>
                    <li><a href="ms-certified-courses/mosexpert-main.html">Microsoft Office Specialist(MOS) Expert</a></li>
                    <li><a href="ms-certified-courses/mosmaster-main.html">Microsoft Office Specialist(MOS) Master</a></li>
                </ul>
            </li>
            <li><a href="http://external_link.co.uk" target="_blank">PD Courses</a></li>
        </ul>
    </li>
    <li>
        <a href="#">Materials</a>
        <ul>
            <li><a href="courseware.html">Course Materials</a></li>
            <li><a href="materials/latest.html">Latest Downloads</a></li>
            <li><a href="materials/access.html">Access</a></li>
            <li><a href="materials/excel.html">Excel</a></li>
        </ul>
    </li>
    <li>
        <a href="testimonials.html">Testimonials</a>
    </li>
    <li><a href="ourteam.html">Our Team</a></li>
    <li><a href="contactus.html">Contact Us</a></li>
</ul>
</nav>

如何折叠(删除其类别)除当前UL之外的所有UL及其父UL。

contains()需要dom元素

只是改变

if (!($.contains($(this), $thisUl)))

if (!($(this)[0].contains($thisUl[0])))

演示

这是面向未来观众的普通javascript解决方案。

(function () {
    "use strict";
    document.querySelector('nav').onclick = function (e) {
        if (e.target.getAttribute('href') == '#') {
            var thisUl = e.target.nextElementSibling;
            var lists = document.querySelectorAll('nav ul.showIt'),
                list;
            for (var i = 0; list = lists[i]; i++) {
                if (!list.isSameNode(thisUl) && !list.contains(thisUl)) list.className = list.className.replace(' showIt', '');
            }
            thisUl.className += ' showIt';
        }
    };
})();

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM