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

如何结合jQuery的toggle与closest实现列表的显示/隐藏

用jQuery实现批量折叠面板:toggle结合closest优化方案

我希望用jQuery的toggle方法结合closest方法实现列表项的显示/隐藏功能,现在逐个元素编写代码的方式太繁琐了。以下是我的HTML结构和当前JS代码:

当前HTML结构

<div class="sidebar-suboptions-box3 main-head-trigger">
    <a href="javascript:void(0)" class="sidebar-suboptions-content dsp-f bullet-point active">
        <div>
            <div class="sidebar-holder-portf">Portafolio 100000-1</div>
            <div class="sidebar-suboptions-money">$ 1,022,158.81</div>
        </div>
    </a>
</div>
<div class="block-profile-portfolios-secondary main-body-trigger" style="display: none;">
    <hr class="sidebar-inteligo-hr-2">
    <div>
        <div class="head-portfolio-active cash-head-trigger">
            <div class="sidebar-suboptions-title horizontal-bar"> <em>Cash</em> y equivalentes
                <br><div class="sidebar-suboptions-money">$ 726,134.93</div>
            </div>
        </div>
        <div class="portfolio-active-subitems cash-body-trigger" style="display: none;">
            <div class="portfolio-active-subitems-head">
                <div class="sidebar-subblock-secondary-2">
                    <div class="sidebar-subblock-title">Cuenta trading
                        <br><div class="sidebar-subblock-money-2">$ 726,134.93</div>
                    </div>
                </div>
                <div class="sidebar-subblock-secondary-2">
                    <div class="sidebar-subblock-title">Prod. estructurados
                        <br><div class="sidebar-subblock-money-2">$ 726,134.93</div>
                    </div>
                </div>
                <div class="sidebar-subblock-secondary-2">
                    <div class="sidebar-subblock-title">Depósitos
                        <br>
                        <div class="sidebar-subblock-money-2">$ 726,134.93</div>
                    </div>
                </div>
            </div>
        </div>
        <div class="head-portfolio-active activos-head-trigger">
            <div class="sidebar-suboptions-title horizontal-bar">Activos
                <br><div class="sidebar-suboptions-money-2">$ 726,134.93</div>
            </div>
        </div>
        <div class="portfolio-active-subitems activos-body-trigger" style="display: none;">
            <div class="portfolio-active-subitems-head">
                <div class="sidebar-subblock-secondary-2">
                    <div class="sidebar-subblock-title">Cuenta trading
                        <br><div class="sidebar-subblock-money-2">$ 726,134.93</div>
                    </div>
                </div>
                <div class="sidebar-subblock-secondary-2">
                    <div class="sidebar-subblock-title">Prod. estructurados
                        <br><div class="sidebar-subblock-money-2">$ 726,134.93</div>
                    </div>
                </div>
                <div class="sidebar-subblock-secondary-2">
                    <div class="sidebar-subblock-title">Depósitos
                        <br>
                        <div class="sidebar-subblock-money-2">$ 726,134.93</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

当前JS代码

$( ".main-head-trigger" ).click(function() {
    $( ".main-body-trigger" ).toggle( "fast", function() {
      // Animation complete.
    });
});

优化方案:批量绑定事件+相对DOM定位

不需要为每个触发元素单独编写事件处理函数,利用jQuery的选择器和DOM相对定位方法(closest/next),可以一次性处理所有折叠面板:

方案1:适配现有类名规则(无需修改HTML)

你的HTML已经遵循了*-head-trigger对应*-body-trigger的命名规则,且触发头和内容块是同级元素,直接用属性选择器和next()定位:

// 匹配所有以-head-trigger结尾的触发元素
$('[class$="-head-trigger"]').on('click', function() {
    // 找到对应的以-body-trigger结尾的内容块,切换显示状态
    $(this).next('[class$="-body-trigger"]').toggle('fast');
});

方案2:用closest增强结构灵活性(推荐)

如果后续DOM结构调整,触发头和内容块不再是同级,可以给每个折叠组加一个父容器,用closest定位到父容器后,再查找对应的内容块:

首先调整HTML(给每个折叠组加父容器,用通用类名简化选择):

<!-- 外层折叠组 -->
<div class="collapse-group">
    <div class="sidebar-suboptions-box3 collapse-head">
        <!-- 触发头内容 -->
    </div>
    <div class="block-profile-portfolios-secondary collapse-content" style="display: none;">
        <!-- 内层折叠组 -->
        <div class="collapse-group">
            <div class="head-portfolio-active collapse-head">
                <!-- 子触发头内容 -->
            </div>
            <div class="portfolio-active-subitems collapse-content" style="display: none;">
                <!-- 子内容块 -->
            </div>
        </div>
        <div class="collapse-group">
            <div class="head-portfolio-active collapse-head">
                <!-- 子触发头内容 -->
            </div>
            <div class="portfolio-active-subitems collapse-content" style="display: none;">
                <!-- 子内容块 -->
            </div>
        </div>
    </div>
</div>

然后编写JS:

// 给所有触发头绑定点击事件
$('.collapse-head').on('click', function() {
    // 找到最近的折叠组父容器,再查找对应的内容块
    $(this).closest('.collapse-group').find('.collapse-content').toggle('fast');
});

优化优势

  • 扩展性强:新增折叠面板时,只需按类名规则编写HTML,无需修改JS
  • 代码简洁:避免重复编写大量相同逻辑的事件处理函数
  • 冲突风险低:利用相对DOM定位,不会影响页面其他元素

内容的提问来源于stack exchange,提问作者José Carlos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:35:36