Follow up to my previous question - I want to use a button to show / hide multiple elements with the same class name using JS, yet it appears that I can only change the first element with a certain class name, and all further elements with the same class on the page are ignored.
How do I fix this?
function designInfo() {
document.getElementsByClassName("design")[0].style.display = "block";
document.getElementsByClassName("it")[0].style.display = "none";
document.getElementsByClassName("other")[0].style.display = "none";
}
function itInfo() {
document.getElementsByClassName("design")[0].style.display = "none";
document.getElementsByClassName("it")[0].style.display = "block";
document.getElementsByClassName("other")[0].style.display = "none";
}
function allInfo() {
document.getElementsByClassName("design")[0].style.display = "block";
document.getElementsByClassName("it")[0].style.display = "block";
document.getElementsByClassName("other")[0].style.display = "block";
}
.it {}
.design {}
.other {}
.indent {
margin: .5em 1em .5em 1em;
}
<button onclick="designInfo()">show design stuff</button>
<button onclick="itInfo()">show IT stuff</button>
<button onclick="allInfo()">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
Different Elements Can Share Same Class Different HTML elements can point to the same class name.
Use the querySelectorAll() method to select elements by multiple ids, e.g. document. querySelectorAll('#box1, #box2, #box3') . The method takes a string containing one or more selectors as a parameter and returns a collection of the matching elements.
You need to use a for-loop over all items you get from document.getElementsByClassName()
method as in following snippet:
function setDisplay(className, displayValue) {
var items = document.getElementsByClassName(className);
for (var i=0; i < items.length; i++) {
items[i].style.display = displayValue;
}
}
function designInfo() {
setDisplay("design", "block");
setDisplay("it", "none");
setDisplay("other", "none");
}
function itInfo() {
setDisplay("design", "none");
setDisplay("it", "block");
setDisplay("other", "none");
}
function allInfo() {
setDisplay("design", "block");
setDisplay("it", "block");
setDisplay("other", "block");
}
.it {}
.design {}
.other {}
.indent {
margin: .5em 1em .5em 1em;
}
<button onclick="designInfo()">show design stuff</button>
<button onclick="itInfo()">show IT stuff</button>
<button onclick="allInfo()">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
Update Also, it could be written with less code as below:
function filter(designDisp, itDisp, otherDisp) {
setDisplay("design", designDisp);
setDisplay("it", itDisp);
setDisplay("other", otherDisp);
}
function setDisplay(className, displayValue) {
var items = document.getElementsByClassName(className);
for (var i=0; i < items.length; i++) {
items[i].style.display = (displayValue? "block" : "none");
}
}
.it {}
.design {}
.other {}
.indent {
margin: .5em 1em .5em 1em;
}
<button onclick="filter(1,0,0)">show design stuff</button>
<button onclick="filter(0,1,0)">show IT stuff</button>
<button onclick="filter(1,1,1)">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With