Reputation: 175
I'm trying to understand how to only trigger the function on the button being click - currently my code is applying it to all elements and only the first is changing innerTEXT
var toggleInnerHTML = document.querySelectorAll(".toggleBtn");
var desc = document.querySelectorAll('.description');
for (i = 0; i < toggleInnerHTML.length; i++) {
toggleInnerHTML[i].addEventListener('click', toggleText);
var curText = toggleInnerHTML[i].innerText;
}
function toggleText() {
for (i = 0; i < curText.length; i++) {
if(this.innerText == curText[i]){
toggleInnerHTML[i].innerText = "-";
}
else{
toggleInnerHTML[i].innerText = curText[i];
}
}
for (i = 0; i < desc.length; i++) {
desc[i].classList.toggle('open');
}
}
.description {
display: none;
}
.description.open {
display: block;
}
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
Upvotes: 0
Views: 45
Reputation: 47
why don't you use onclick='functiontocall()
inside your html
for example
<button class="toggleBtn" onclick='Showtext('description1')'>+</button>
and JS
function Showtext(textclass){
document.getElementsByClassName(textclass).display = "block";
}
but you should change description divs to description1
and description2
and description3
in this case you can specify your buttons
i hope it be useful for you
Upvotes: 0
Reputation: 22355
classList.toggle return a Boolean value, so:
document.querySelectorAll(".toggleBtn").forEach(bt=>
{
bt.onclick=_=>{
bt.textContent = bt.nextElementSibling.classList.toggle('open') ? '-' : '+'
}
})
.description {
display: none;
}
.description.open {
display: block;
}
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
Upvotes: 1
Reputation: 371019
Inside the listener, check the argument to get the event, which points you to the button that was clicked. Then, you can reassign that button's text, and navigate to its nextElementSibling
to get to its adjacent .description
element:
var toggleInnerHTML = document.querySelectorAll(".toggleBtn");
var desc = document.querySelectorAll('.description');
for (i = 0; i < toggleInnerHTML.length; i++) {
toggleInnerHTML[i].addEventListener('click', toggleText);
}
function toggleText(e) {
e.target.textContent = e.target.textContent === '+' ? '-' : '+';
e.target.nextElementSibling.classList.toggle('open');
}
.description {
display: none;
}
.description.open {
display: block;
}
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
<div>
<button class="toggleBtn">+</button>
<div class="description">Text goes here</div>
</div>
Upvotes: 2