I’m trying to create a very simple accordion.
index.html
JavaScript
x
14
14
1
2
<div class="container">
3
4
<div class="accordian">
5
<div class="title">Title</div>
6
<div class="body">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Corrupti mollitia maxime ab. Possimus est optio
7
</div>
8
<div class="accordian">
9
<div class="title">Title</div>
10
<div class="body">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Corrupti mollitia maxime ab. Possimus est optio
11
</div>
12
13
</div>
14
main.js
JavaScript
1
19
19
1
let accordians = document.querySelectorAll(".accordian")
2
3
4
const toggle = e => {
5
if (e.target.nextElementSibling.classList.length < 2) {
6
e.target.nextElementSibling.classList.add("hidden")
7
console.log("1:",e.target.nextElementSibling.classList)
8
}
9
else {
10
e.target.nextElementSibling.classList.remove("hidden")
11
console.log("2:",e.target.nextElementSibling.classList)
12
}
13
}
14
15
accordians.forEach((obj) => {
16
obj.children[1].classList.add("hidden")
17
obj.addEventListener('click', e => { toggle(e) }, false)
18
})
19
The first accordion works without any issue but when clicked one the second on the “toggle” function gets fired twice instantly making no difference. Any clue ?
Advertisement
Answer
First, you don’t need to write a toggle function for classList because it already exists.
Second, your <div class="body">
nodes need to have a closing </div>
tag.
JavaScript
1
8
1
let accordians = document.querySelectorAll(".accordian")
2
3
accordians.forEach((obj) => {
4
obj.children[1].classList.add("hidden")
5
obj.addEventListener('click', e => {
6
e.currentTarget.children[1].classList.toggle("hidden")
7
}, false)
8
})
JavaScript
1
1
1
.hidden { display: none; }
JavaScript
1
12
12
1
<div class="container">
2
3
<div class="accordian">
4
<div class="title">Title</div>
5
<div class="body">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Corrupti mollitia maxime ab. Possimus est optio </div>
6
</div>
7
<div class="accordian">
8
<div class="title">Title</div>
9
<div class="body">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Corrupti mollitia maxime ab. Possimus est optio </div>
10
</div>
11
12
</div>