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

如何修改多个元素的display属性?按钮点击仅首个箭头生效问题解决

问题描述

我有一个包含4个按钮的列表,想要实现点击按钮时,对应右侧的箭头图标切换显示/隐藏状态。但目前代码仅对第一个按钮生效,点击其他按钮没有任何反应。

  • 初始状态:列表中每个按钮右侧都显示箭头图标
  • 点击后效果:只有第一个按钮的箭头状态改变,其余按钮无变化

我的HTML代码

<ul class="sec2drop">
  <li>
    <button onclick="myFunction()" class="collapsible">
      Prepare for a language exam
      <i class="fa fa-caret-right" id="arrow"></i>
    </button>
    <div class="content">
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. A
        veniam, blanditiis, dolores quasi quam, soluta porro ratione
        fugiat minus commodi in maxime amet fugit rerum magnam ducimus
        dignissimos quis non.
      </p>
    </div>
  </li>
  <li>
    <button onclick="myFunction()" class="collapsible">
      Hungarian for kids
      <i class="fa fa-caret-right" id="arrow"></i>
    </button>
    <div class="content">
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. A
        veniam, blanditiis, dolores quasi quam, soluta porro ratione
        fugiat minus commodi in maxime amet fugit rerum magnam ducimus
        dignissimos quis non.
      </p>
    </div>
  </li>
</ul>

我的JavaScript代码

function myFunction() {
  var x = document.getElementById("arrow");
  if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";
  }
}
解决方案

问题核心是HTML中ID属性必须唯一,你给所有箭头都用了id="arrow",而document.getElementById()只会返回第一个匹配的元素,所以只有第一个按钮生效。以下是两种可行的修改方式:

方法1:通过传入当前按钮元素定位箭头

修改HTML的点击事件,把当前按钮对象this传入函数:

<button onclick="myFunction(this)" class="collapsible">
  Prepare for a language exam
  <i class="fa fa-caret-right"></i>
</button>

同时删除所有箭头的id="arrow",然后更新JavaScript函数:

function myFunction(btn) {
  // 获取当前按钮内的箭头元素
  const arrow = btn.querySelector(".fa-caret-right");
  arrow.style.display = arrow.style.display === "none" ? "block" : "none";
}

方法2:事件委托(更推荐)

完全移除HTML中的onclick属性,通过父容器统一监听点击事件,代码更简洁易维护:

<ul class="sec2drop">
  <li>
    <button class="collapsible">
      Prepare for a language exam
      <i class="fa fa-caret-right"></i>
    </button>
    <div class="content">
      <p>...</p>
    </div>
  </li>
  <!-- 其余按钮结构保持一致 -->
</ul>

对应的JavaScript代码:

const listContainer = document.querySelector(".sec2drop");
listContainer.addEventListener("click", function(e) {
  // 判断点击的是按钮元素
  if (e.target.classList.contains("collapsible")) {
    const arrow = e.target.querySelector(".fa-caret-right");
    arrow.style.display = arrow.style.display === "none" ? "block" : "none";
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:07:03