javascript - 使用纯 javascript 的手风琴 - 仅适用于双击
问题描述
我想通过使用手风琴方法扩展 onclick 事件(纯 javascript)上的 div,因为它具有多个级别,但它仅适用于双击。我希望它能够正常运行,而不是 javascript onload。
提前感谢您提供的任何帮助!
function togglediv(){
let acc = document.getElementsByClassName("accordion");
for (var i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
let panel=this.nextElementSibling;
if(panel!==null){
if (panel.style.display==="block") {
panel.style.display="none";
} else {
panel.style.display="block";
}
}
return false;
});
}
}
.accordion, .subpanel-accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
display:flex;
}
.panelaccordion {
padding: 0 18px;
display: none;
background-color: white;
overflow: hidden;
}
<div class="accordion" id="main-1" onclick="togglediv();">Level 1</div>
<div class="panelaccordion level2">
<div class="accordion" id="sub-1" onclick="togglediv();">
<div class="text-accordion">Level 2</div>
<div class="button-accordion" onclick="getid('sub-1');">Click level 2</div>
</div>
<div class="subpanel-accordion" id="subpanel-1">
<div class="text-accordion">Level 3</div>
<div class="button-accordion" onclick="getidsub('subpanel-1');">Click level 3</div>
</div>
<div class="accordion" id="sub-2" onclick="togglediv();">
<div class="text-accordion">Level 2(2)</div>
<div class="button-accordion" onclick="getid('sub-2');">Click level 2(2)</div>
</div>
</div>
解决方案
您不需要,onclick="togglediv()
因为您已经添加了事件侦听器,因此您可以简单地删除togglediv()
并添加事件侦听器,如下所示:
let acc = document.getElementsByClassName("accordion");
for (var i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
let panel = this.nextElementSibling;
if (panel !== null) {
if (panel.style.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
}
return false;
});
}
.accordion,
.subpanel-accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
display: flex;
}
.panelaccordion {
padding: 0 18px;
display: none;
background-color: white;
overflow: hidden;
}
<div class="accordion" id="main-1">Level 1</div>
<div class="panelaccordion level2">
<div class="accordion" id="sub-1">
<div class="text-accordion">Level 2</div>
<div class="button-accordion" onclick="getid('sub-1');">
Click level 2
</div>
</div>
<div class="subpanel-accordion" id="subpanel-1">
<div class="text-accordion">Level 3</div>
<div class="button-accordion" onclick="getidsub('subpanel-1');">
Click level 3
</div>
</div>
<div class="accordion" id="sub-2">
<div class="text-accordion">Level 2(2)</div>
<div class="button-accordion" onclick="getid('sub-2');">
Click level 2(2)
</div>
</div>
</div>
推荐阅读
- c - 即使在不必要的情况下,是否有客观的理由反对使用大括号?
- java - 在Java中查找两个字符串之间的多个字符串
- regex - 匹配脚本标记之外的所有出现
- javascript - 如何从字符串中删除除特殊类之外的所有 HTML 元素?
- dictionary - Clojure 嵌套映射。从值访问父键
- arrays - 参数类型“Spot.Restriction.Type”不符合预期类型“_FormatSpecifiable”
- c# - C# - 在将其分配给数据表之前检查 CSV 中的列是否存在
- javascript - Javascript IIEF - 如果无法访问任何变量,那么为什么我可以通过函数访问它?
- visual-studio-code - VS Code:如何在代码和终端之间切换*不*关注下拉菜单
- swift - SWIFT:为什么 viewDidLayoutSubviews 中的形状被创建了两次