You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅获取选中的菜单/子菜单ID,避免触发父级ID输出?

分类菜单点击获取当前及父级ID解决方案

jQuery 实现(推荐,适配动态生成菜单)

你的现有代码存在两个核心问题:选择器错误导致绑定对象不对,且没有处理父级ID的收集逻辑。以下是修复后的代码:

HTML 结构(保持原有结构不变)

<nav role="navigation">
    <ul class="category">
        <li class="subcategory category-li" id="category-name">category
            <ul class="category">
                <li class="category-li" id="1">books
                    <ul class="category">
                        <li class="category-li" id="4">art
                            <ul class="category">
                                <li class="category-li" id="6">modern</li>
                                <li class="category-li" id="7">classic</li>
                            </ul>
                        </li>
                        <li class="category-li" id="5">scientific</li>
                    </ul>
                </li>
                <li class="category-li" id="2">home</li>
                <li class="category-li" id="3">kids</li>
            </ul>
        </li>
    </ul>
</nav>

jQuery 代码

$(document).on('click', '.category-li', function(e) {
    // 阻止事件冒泡,避免父级菜单的点击事件被触发
    e.stopPropagation();
    
    // 先收集当前点击项的ID
    const idList = [$(this).attr('id')];
    
    // 向上遍历所有带category-li类的父级元素,收集它们的ID
    $(this).parents('.category-li').each(function() {
        idList.push($(this).attr('id'));
    });
    
    // 按要求输出:先当前ID,再父级ID
    console.log('选中的ID序列:');
    idList.forEach(id => console.log(id));
});

关键说明

  • 使用事件委托绑定点击事件:$(document).on('click', '.category-li', ...),适配数据库动态生成的菜单元素,避免静态绑定失效。
  • e.stopPropagation():阻止事件向上冒泡,防止点击子菜单时父菜单的点击事件也触发,导致重复输出。
  • parents('.category-li'):向上查找所有符合类名的父级元素,确保能收集到所有层级的父分类ID。

原生 JavaScript 实现(无需依赖jQuery)

如果项目不想引入jQuery,可使用原生JS实现相同逻辑:

document.addEventListener('click', function(e) {
    // 仅处理带有category-li类的元素点击
    if (!e.target.classList.contains('category-li')) return;
    
    e.stopPropagation();
    const idList = [e.target.id];
    
    // 循环向上查找父级的category-li元素
    let parentEl = e.target.parentElement.closest('.category-li');
    while (parentEl) {
        idList.push(parentEl.id);
        parentEl = parentEl.parentElement.closest('.category-li');
    }
    
    // 输出结果
    console.log('选中的ID序列:');
    idList.forEach(id => console.log(id));
});

关键说明

  • closest('.category-li'):原生API,向上查找最近的匹配选择器的父元素,循环遍历可获取所有层级父级。
  • 事件委托逻辑与jQuery版本一致,适配动态生成的菜单。

内容的提问来源于stack exchange,提问作者user440652

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:20:39