You need to enable JavaScript to run this app. JavaScript实现父元素点击切换子元素显隐及联动隐藏其他子元素
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现父元素点击切换子元素显隐及联动隐藏其他子元素

问题核心逻辑缺口

现有点击处理流程缺少对目标子元素的状态判断,每次触发点击都会无条件将所有子元素重置为隐藏状态,再强制给当前关联子元素添加show类,完全无法识别“已展开的元素被再次点击”的场景,因此实现不了二次点击收起的效果。

具体实现方案
  • 原代码中通过事件回调内的this获取被点击父元素、读取data属性定位关联子元素的逻辑完全可用,不需要额外调整
  • 新增判断逻辑:在拿到对应关联子元素the_element后,先通过classList.contains('show')校验该元素当前是否处于展开状态
  • 分支处理规则:
  • 若目标子元素已经带有show类(处于展开态):直接移除show类、补回hide类完成收起,不需要执行全量重置操作——因为正常状态下同一时间只会有一个子元素处于展开态,其他子元素本来就已经是隐藏状态
  • 若目标子元素没有show类(处于收起态):保留原有全量隐藏所有子元素的逻辑,再给当前目标子元素添加show类完成展开
修改后完整可运行代码
<!-- 原有HTML结构保持不变 -->
<div class="parent" data="one">
  <div class="child hide" id="one">
    test
  </div>
</div>

<div class="parent" data="two">
  <div class="child hide" id='two'>
    test 2
  </div>
</div>

<script>
var parent = document.getElementsByClassName("parent");
for (var i = 0; i < parent.length; i++) {
  parent[i].addEventListener("click", function () {
    var child = document.getElementsByClassName("child");
    var attribute = this.getAttribute("data");
    var the_element = document.getElementById(attribute);

    // 判断目标元素的当前展示状态
    if (the_element.classList.contains('show')) {
      // 已展开时点击:切换为收起
      the_element.classList.remove('show');
      the_element.classList.add('hide');
    } else {
      // 未展开时点击:重置所有元素为隐藏,再展开当前目标
      for (var is = 0; is < child.length; is++) {
        child[is].classList.add('hide');
        child[is].classList.remove('show');
      }
      the_element.classList.add('show');
    }
  });
}
</script>

补充说明:上述逻辑没有引入额外的全局状态标记,直接用类名作为状态判断依据,和原有代码的适配性最高,不会产生冗余的状态同步问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 19:06:04