javascript - $(document).on ("click"... 如何在单击文档上的其他任何位置时折叠列表

标签 javascript html css

我正在尝试为我的网站构建一个可折叠/可展开的菜单。我有一个版本,将鼠标悬停在一个类别上会导致子类别展开,但我真正想要的是单击一个类别并让子类别展开并保持展开状态,直到我单击页面上的其他任何地方。我想我已经很接近了——我看过很多例子,只是在努力将它们拼凑在一起。

目前的情况是,当我点击列表本身时,我可以让列表展开和折叠,但是当我点击文档的其他地方时,我无法让任何事情发生。我意识到我还必须对 stopPropagation() 做一些事情,但首先要做的是......

Javascript:

function show_sub(cat){
  cat.querySelector("ul").style.display = (cat.querySelector("ul").style.display == "block") ? "none" : "block";
};

$('body').on("click", function () {
    $("#nav ul").style.display="none";
});

CSS:

#nav {
    width: 120px;
    border: black 1px solid;
}
#nav li > ul {
    display:none;
}

HTML:

<ul id="nav">
    <li id="cat1" onclick="show_sub(this)">Vegetables
        <ul>
            <li>Beans</li>
            <li>Carrots</li>
            <li>Greens</li>
            <li>Onions</li>
        </ul>
    </li>
        <li id="cat2" onclick="show_sub(this)">Fruit
            <ul>
                <li>Apple</li>
                <li>Banana</li>
                <li>Cantaloupe</li>
            </ul>
        </li>
</ul>

link to jfiddle

提前感谢您的耐心等待。我对 Javascript 没有太多经验,但我发现 Stack Overflow 对我了解如何更改现有网站非常有帮助。然而,当涉及到从头开始创建任何东西时,我仍然犹豫不决。

编辑:使用来自@JustinMorgan 的解决方案并添加一行以便一次只能看到一个子菜单:http://jsfiddle.net/nbavc5g7/2/

最佳答案

你是对的,你确实需要 stopPropagation。展开子列表的同一点击事件向上传播到链中,body 上的点击处理程序立即再次隐藏它。

您还可以在几个地方简化您的代码。试试这个:

$('#nav > li').on('click', function(e) {
    e.stopPropagation();
    $('ul', this).show(); 
});

$('body').on("click", function () {
    $("#nav ul").hide();
});  

演示:http://jsfiddle.net/d60Lcq9j/1/

编辑:这是一个稍微复杂一些的版本,您可以通过再次单击其标题来关闭子菜单。此版本不会停止事件传播:

$('#nav li').on('click', function(e) {
    if (e.target === this) {
        $(this).children('ul').toggle(); 
    }
});

$('body').on("click", function (e) {
    var item = $(e.target).closest('#nav > li');
    $('#nav > li')
        .not(item)
        .find('ul')
        .hide();
});

演示:http://jsfiddle.net/Luk35kb6/

关于javascript - $(document).on ("click"... 如何在单击文档上的其他任何位置时折叠列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25428561/

相关文章:

javascript - 响应式下拉菜单正在重新加载我的页面

CSS - 不使用绝对定位和 JS 的水平样式列表

javascript - 内部 html 单选按钮数组值被写入 for 循环

html - 如何将li中的文本换行为与ul的宽度一样长?

html - 可编辑表格中第二个 td 的固定宽度

java - 带有嵌入式 HTML 的 PDF 报告

javascript - "Failed - Network Error"尝试使用 'download' 属性在 HTML5 中提供下载时

javascript - Dojo中的动态内容单页应用

javascript - 为什么我的子字符串在这样写时可以工作?

javascript - 当我悬停链接时如何更改 DIV 背景?