我怀疑问题出在下面JS代码中的第const active = document.querySelector(".accordion.active");行.它似乎没有检索到那个元素.你能帮我调试一下吗?或者我应该用别的东西而不是querySelector?还发现,当点击Accordion元素时,this.classList.add("active");没有向Accordion元素添加"活动类".

document.addEventListener("DOMContentLoaded", function(event) {
  var acc = document.getElementsByClassName("accordion");
  var i;
  for (i = 0; i < acc.length; i++) {
    acc[i].addEventListener("click", function() {
      const active = document.querySelector(".accordion.active");
      console.log(active);
      if (active) {
        active.classList.remove('active'); // remove active class from accordions
      }
      this.classList.add("active"); // add it to this one
      
      this.classList.toggle("active");
      var panel = this.nextElementSibling;
      if (panel.style.display === "block") {
        panel.style.display = "none";
      } else {
        panel.style.display = "block";
      }
    });
  }
});
.accordion {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 1.5rem;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
  transition: 0.4s;
}

.active,
.accordion:hover {
  background-color: #ccc;
}

.panel {
  padding: 0 18px;
  display: none;
  background-color: white;
  overflow: hidden;
  background: red;
}

.active+.panel {
  display: block;
}
<div class="row">
  <button class="accordion"><div class="question"><?php echo $label; ?></div></button>
  <div class="panel">
    <p class="answer">
      <?php echo $answer; ?>
    </p>
    </br>
  </div>
</div>
<div class="row">
  <button class="accordion"><div class="question"><?php echo $label; ?></div></button>
  <div class="panel">
    <p class="answer">
      <?php echo $answer; ?>
    </p>
    </br>
  </div>
</div>

推荐答案

您可能应该重新考虑您的方法,因为在您的情况下,您甚至不需要基本的Java脚本!如果你需要一个定制的手风琴,那么你可以使用JavaScript,我试着向你解释如何使用.

您需要的是一个包含<details><summary>的干净的HTML.请参阅此示例:

<details class="accordion">
  <summary>Question 1</summary>
  <strong>Answer:</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus molestias ex, rem ducimus quibusdam nihil aliquam corporis id sint aperiam dolores, accusantium culpa adipisci similique doloremque eius reiciendis. Veniam, perferendis.
</details>
<details class="accordion">
  <summary>Question 2</summary>
  <strong>Answer:</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laborum doloribus tenetur tempore esse consectetur incidunt, distinctio eaque suscipit error fugit tempora, quas accusantium recusandae autem voluptatibus qui quasi molestiae odit.
</details>

有了css,你可以按照你想要的方式来设计它.如果你想go 掉箭头,你可以用details > summary { list-style: none; }试试.此外,您还可以使用任何其他字符.在本例中,我们使用符号+(加号),当手风琴已经打开时,它应该是-(减号):

details > summary {
  list-style-type: '+ ';
}
details[open] > summary {
  list-style-type: "- ";
}
details > summary::-webkit-details-marker {
  display: none;
}

summary {
  background-color: #ccc;
}
<details class="accordion">
  <summary>Question 1</summary>
  <strong>Answer:</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus molestias ex, rem ducimus quibusdam nihil aliquam corporis id sint aperiam dolores, accusantium culpa adipisci similique doloremque eius reiciendis. Veniam, perferendis.
</details>
<details class="accordion">
  <summary>Question 2</summary>
  <strong>Answer:</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laborum doloribus tenetur tempore esse consectetur incidunt, distinctio eaque suscipit error fugit tempora, quas accusantium recusandae autem voluptatibus qui quasi molestiae odit.
</details>

如你所见,所有悬而未决的问题都是悬而未决的.如果您只希望活动问题保持打开状态,则可以使用JavaScript.

document.querySelectorAll('details').forEach((accordion) => {
  accordion.addEventListener('click', (e) => {
    document.querySelectorAll('details').forEach((event) => {
      if (accordion !== event) {
        event.removeAttribute('open');
      }
    });
  });
});
details > summary {
  list-style-type: '+ ';
}
details[open] > summary {
  list-style-type: "- ";
}
details > summary::-webkit-details-marker {
  display: none;
}

summary {
  background-color: #ccc;
}
<details class="accordion">
  <summary>Question 1</summary>
  <strong>Answer:</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus molestias ex, rem ducimus quibusdam nihil aliquam corporis id sint aperiam dolores, accusantium culpa adipisci similique doloremque eius reiciendis. Veniam, perferendis.
</details>
<details class="accordion">
  <summary>Question 2</summary>
  <strong>Answer:</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laborum doloribus tenetur tempore esse consectetur incidunt, distinctio eaque suscipit error fugit tempora, quas accusantium recusandae autem voluptatibus qui quasi molestiae odit.
</details>

Javascript相关问答推荐

访客柜台的风格React.js

强制执行useStatego struct 化变量[foo,setFoo]的命名约定?

通过实现regex逻辑自定义数据表搜索

在JavaScript中对大型级联数组进行切片的最有效方法?

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

Angular:动画不启动

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

我的角模板订阅后不刷新'

邮箱密码重置链接不适用于已部署的React应用程序

未捕获的运行时错误:调度程序为空

在SuperBase JS客户端中寻址JSON数据

如何在FiRestore中的事务中使用getCountFromServer

react 路由DOM有条件地呈现元素

select 2-删除js插入的项目将其保留为选项

在Press Reaction本机和EXPO av上播放单个文件

如何检测当前是否没有按下键盘上的键?

限制数组中每个元素的长度,

使用Java脚本替换字符串中的小文本格式hashtag

如何使用fltter_js将对象作为参数传递给javascrip?