In order for the fucntion to change the display to “hidden” then back to “block” it requires 2 clicks for each. Why is this? How do I reduce it to just one click?
JavaScript
x
16
16
1
function showOfferMessage() {
2
var coll = document.getElementsByClassName("collapsible");
3
var i;
4
5
for (i = 0; i < coll.length; i++) {
6
coll[i].addEventListener("click", function() {
7
this.classList.toggle("active");
8
var content = this.nextElementSibling;
9
if (content.style.display === "block") {
10
content.style.display = "none";
11
} else {
12
content.style.display = "block";
13
}
14
});
15
}
16
}
JavaScript
1
12
12
1
<div class="offer-row collapsible" id="'.$oid.'" onclick="showOfferMessage()">
2
<div class="offer-info-item">
3
<div class="offcatreview-title">
4
<h3>Cat. Rating</h3>
5
</div>
6
<div class="offer-cat-rating">
7
</div>
8
</div>
9
</div>
10
<div class="content">
11
<p>'.$message.'</p>
12
</div>
Advertisement
Answer
That’s because you’re registering an event listener on every click! So your listener executes once more every time you click.
Your code fixed:
JavaScript
1
10
10
1
2
function showOfferMessage(element) {
3
element.classList.toggle("active");
4
var content = element.nextElementSibling;
5
if (content.style.display === "block") {
6
content.style.display = "none";
7
} else {
8
content.style.display = "block";
9
}
10
}
JavaScript
1
12
12
1
<div class="offer-row collapsible" id="'.$oid.'" onclick="showOfferMessage(this)">
2
<div class="offer-info-item">
3
<div class="offcatreview-title">
4
<h3>Cat. Rating</h3>
5
</div>
6
<div class="offer-cat-rating">
7
</div>
8
</div>
9
</div>
10
<div class="content" style="display: block">
11
<p>'.$message.'</p>
12
</div>