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

嵌套折叠元素问题:首个<div>正常,第二个首次点击失效

嵌套可折叠Div首次点击无响应的解决方案

问题原因

你遇到的问题源于事件监听使用了捕获模式(addEventListener第三个参数设为true),结合嵌套结构的事件传播逻辑,导致第二个可折叠头部的首次点击事件未正确触发类切换。捕获模式下事件从外层元素向内层传递,嵌套的可折叠结构会干扰首次加载时的事件处理流程,引发无响应问题。

解决方案

  • 将事件监听改为冒泡模式(省略addEventListener第三个参数,或显式设为false,这是默认且更符合交互预期的模式)
  • 使用e.currentTarget替代e.target,确保操作的是绑定事件的目标元素,避免意外的元素匹配问题
  • 添加e.stopPropagation()阻止事件冒泡,避免嵌套结构的事件互相干扰

修改后的代码

JavaScript代码

document.addEventListener('DOMContentLoaded', function() {
  const found = document.querySelectorAll('.collapse-content .collapse-head-content');
  
  for (let i = 0, len = found.length; i < len; i++) {
    // 改为冒泡模式(省略第三个参数,默认即为false)
    found[i].addEventListener('click', handler);
  }

  function handler(e) {
    // 使用currentTarget确保操作绑定事件的元素
    const targetEl = e.currentTarget;
    const hidden = targetEl.classList.contains('hide-content');
    
    if (hidden) {
      targetEl.classList.remove('hide-content');
    } else {
      targetEl.classList.add('hide-content');
    }
    // 阻止事件冒泡,避免嵌套结构的干扰
    e.stopPropagation();
  }
});

CSS代码(无需修改)

.collapse-content .collapse-head-content::before {
  content: ' ^ ';
  cursor: pointer;
}

.collapse-content .hide-content.collapse-head-content::before {
  content: ' > ';
}

.collapse-content .hide-content.collapse-head-content~.collapse-body-content {
  display: none;
}

HTML代码(无需修改)

<div class="bank-details collapse-content">
  <div class="state-name collapse-head-content hide-content">
    Click me to collapse / show
  </div>
  <div class="collapse-body-content">
    <div class="collapse-content">
      <div class="district-name collapse-head-content hide-content">
        District
      </div>
      <div class="branch-name collapse-body-content">
        <a href="#">name</a>
        <a href="#">name</a>
        <a href="#">name</a>
      </div>
    </div>
  </div>
  <div class="state-name collapse-head-content hide-content">
    Click me to collapse / show
  </div>
  <div class="collapse-body-content">
    <div class="collapse-content">
      <div class="district-name collapse-head-content hide-content">
        District
      </div>
      <div class="branch-name collapse-body-content">
        <a href="#">name</a>
        <a href="#">name</a>
      </div>
    </div>
  </div>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:40:35