当我点击一个问题时,我只想显示一个答案,但所有答案都显示出来了。
let ques = document.querySelectorAll(".question")
let ans = document.querySelectorAll(".answer")
ques.forEach((question) => {
question.addEventListener("click", () => {
ans.forEach((answer) => {
answer.classList.toggle("display")
})
})
})
.answer {
display: none;
}
.answer.display {
display: block;
}
<div class="faq">
<div class="question">question</div>
<div class="answer">answer</div>
</div>
<div class="faq">
<div class="question">question</div>
<div class="answer">answer</div>
</div>
<div class="faq">
<div class="question">question</div>
<div class="answer">answer</div>
</div>
5条答案
按热度按时间brvekthn1#
更短,具有委托事件处理
说明:当有人单击主体时,找出是否单击了一个问题,如果是,则获取它的下一个兄弟(答案)并切换其显示类。
x8diyxa72#
下面是一个使用adjacent css sibling selector和event delegation的解决方案。现在,您只需要在
.question
元素上操作active
类就可以显示正确的答案。jm81lzqq3#
从最近的静态容器中委托-向同一容器中的许多相同元素添加eventListener永远都没有用。
为简单起见,请使用隐藏。或者使用
classList.toggle("display",tgt.nextElementSibling === answer)
4ioopgfo4#
不要将侦听器附加到所有元素,而是将FAQ部分 Package 在一个容器中,添加 * 一个 * 侦听器(这称为event delegation),并在其子元素“冒泡”DOM时捕获事件。
如果单击的元素是一个问题,则可以在其
nextElementSibling
上切换显示类。您可以缓存答案元素,然后在处理程序中使用
forEach
迭代它们。vcirk6k65#
代码中的问题是因为循环遍历了所有
.answer
元素,而不是与单击的.question
相关的元素。要执行您需要的操作,您可以使用
closest()
和querySelector()
在与单击的.question
相同的父级中查找.answer
,并在其上切换display
类。然后可以循环遍历所有其他.answer
元素,并从中删除display
类。下面是一个工作示例: