Reputation: 363
I am trying to change classes of a container div element and few div elements nested within it, when clicked on the container div. I can successfully change the class of container element (case_study_section), but don't know how to target the nested (child) div elements (case_study_images, case_study_image1,..). Please help.
P.S.: I need to add different classes to different child elements. So will hvae to target them separately.
function expandCollapse(case_study_section) {
var sectionClasses = case_study_section.classList;
var imagesClasses = case_study_section.getElementsByClassName('case_study_images').classList;
if (sectionClasses.contains("collapsed_section")) {
sectionClasses.remove("collapsed_section");
sectionClasses.add("expanded_section");
} else {
sectionClasses.remove("expanded_section");
sectionClasses.add("collapsed_section");
}
}
.case_study_section {
width: 100px;
height: 100px;
}
.collapsed_section {
background-color: #ff0000;
}
.expanded_section {
background-color: #000000;
}
<div class="case_study_section collapsed_section" onClick="expandCollapse(this)">
<div class="case_study_images collapsed_images">
<div class="case_study_image1">
</div>
<div class="case_study_image2">
</div>
<div class="case_study_image3">
</div>
</div>
</div>
Upvotes: 0
Views: 1373
Reputation: 16515
Well if you have the parent are looking for some children you can:
var elements = case_study_section.querySelectorAll('.case_study_images');
Array.from(elements).forEach(function (child) {
child.classList.add('a-class');
})
Just use a regular css selector.
If you need to add different classes to different children you can:
//somehow map the selector to the classes
//here the object key is the selector,
//the value the classes
var map = {
'.case_study_image1': ['a-class', 'b-class'],
'.case_study_image2': ['c-class']
};
//iterate over the keys
Object.keys(map).forEach(function (selector) {
//get the classes
var classes = map[selector],
//get the element
element = case_study_section.querySelector(selector),
//get the classList
cl = element.classList;
//apply all at once
cl.add.apply(cl, classes);
});
Upvotes: 1
Reputation: 22500
Try with children
case_study_section.getElementsByClassName('case_study_images')[0].children
Or x.getElementsByClassName()\[0\]
case_study_section.getElementsByClassName('case_study_images')[0].getElementsByClassName('images classname')[0]
function expandCollapse(case_study_section) {
var sectionClasses = case_study_section.classList;
var imagesClasses = case_study_section.getElementsByClassName('case_study_images').classList;
console.log(case_study_section.getElementsByClassName('case_study_images')[0].children)
if (sectionClasses.contains("collapsed_section")) {
sectionClasses.remove("collapsed_section");
sectionClasses.add("expanded_section");
} else {
sectionClasses.remove("expanded_section");
sectionClasses.add("collapsed_section");
}
}
.case_study_section {
width: 100px;
height: 100px;
}
.collapsed_section {
background-color: #ff0000;
}
.expanded_section {
background-color: #000000;
}
<div class="case_study_section collapsed_section" onClick="expandCollapse(this)">
<div class="case_study_images collapsed_images">
<div class="case_study_image1">
</div>
<div class="case_study_image2">
</div>
<div class="case_study_image3">
</div>
</div>
</div>
Upvotes: 0
Reputation: 177
You can try using var children = this.getElementsByTagName("div").getElementsByTagName("div")
and then do stuff with the elements returned by that
Upvotes: 0