Vanilla JS - 可以在子元素上 add/remove class 但所有元素都处于活动状态
Vanilla JS - Can add/remove class on child elements but all are active
我可以在子元素上添加和删除 类,但所有元素都处于活动状态。我试图一次仅在一个活动元素上添加和删除。我错过了什么?
<ul id="parent" class="container">
<li class="child"><a href="#one">one</a></li>
<li class="child"><a href="#two">two</a></li>
<li class="child"><a href="#three">three</a></li>
</ul>
document.addEventListener("DOMContentLoaded", function() {
const parent = document.querySelector('#parent');
parent.style.backgroundColor = 'blue';
const childrens = document.querySelectorAll('.child');
const child = document.querySelector('.child a')
Array.prototype.forEach.call(
document.querySelectorAll('.child'),
function(element) {
element.onclick = addActive;
}
);
function addActive(element){
element = this;
if(element.classList.contains('active')) {
element.classList.remove('active');
} else {
element.classList.add('active');
}
}
});
这是一个:codepen
现在您 adding/removing 仅来自被点击元素的活动 class。在将单击的元素设置为活动元素之前,您必须从所有元素中删除 class。
例如
function addActive(element) {
element = this;
if (element.classList.contains('active')) {
element.classList.remove('active');
} else {
childrens.forEach(function(e) {
e.classList.remove('active');
});
element.classList.add('active');
}
}
一个解决方案是先从所有元素中删除 active
class:
function addActive(element) {
childrens.forEach(function(elem) {
elem.classList.remove("active");
});
element = this;
if (element.classList.contains("active")) {
element.classList.remove("active");
} else {
element.classList.add("active");
}
}
这可能是使用纯 js 切换子元素的最直接方法。
<ul id="parent" class="container">
<li class="child"><a href="#one">one</a></li>
<li class="child"><a href="#two">two</a></li>
<li class="child"><a href="#three">three</a></li>
</ul>
<script>
//get children
var theChildren = document.querySelector('#parent').children;
//set event listener for to each child
function selectChild(child) {
child.addEventListener('click', function() {
var checkChildStatus = document.querySelector('#parent .selected');
if (checkChildStatus) {
checkChildStatus.classList.remove('selected');
}
child.classList.add('selected');
});
}
//loop through all children
[...theChildren].forEach(selectChild);
</script>
我可以在子元素上添加和删除 类,但所有元素都处于活动状态。我试图一次仅在一个活动元素上添加和删除。我错过了什么?
<ul id="parent" class="container">
<li class="child"><a href="#one">one</a></li>
<li class="child"><a href="#two">two</a></li>
<li class="child"><a href="#three">three</a></li>
</ul>
document.addEventListener("DOMContentLoaded", function() {
const parent = document.querySelector('#parent');
parent.style.backgroundColor = 'blue';
const childrens = document.querySelectorAll('.child');
const child = document.querySelector('.child a')
Array.prototype.forEach.call(
document.querySelectorAll('.child'),
function(element) {
element.onclick = addActive;
}
);
function addActive(element){
element = this;
if(element.classList.contains('active')) {
element.classList.remove('active');
} else {
element.classList.add('active');
}
}
});
这是一个:codepen
现在您 adding/removing 仅来自被点击元素的活动 class。在将单击的元素设置为活动元素之前,您必须从所有元素中删除 class。
例如
function addActive(element) {
element = this;
if (element.classList.contains('active')) {
element.classList.remove('active');
} else {
childrens.forEach(function(e) {
e.classList.remove('active');
});
element.classList.add('active');
}
}
一个解决方案是先从所有元素中删除 active
class:
function addActive(element) {
childrens.forEach(function(elem) {
elem.classList.remove("active");
});
element = this;
if (element.classList.contains("active")) {
element.classList.remove("active");
} else {
element.classList.add("active");
}
}
这可能是使用纯 js 切换子元素的最直接方法。
<ul id="parent" class="container">
<li class="child"><a href="#one">one</a></li>
<li class="child"><a href="#two">two</a></li>
<li class="child"><a href="#three">three</a></li>
</ul>
<script>
//get children
var theChildren = document.querySelector('#parent').children;
//set event listener for to each child
function selectChild(child) {
child.addEventListener('click', function() {
var checkChildStatus = document.querySelector('#parent .selected');
if (checkChildStatus) {
checkChildStatus.classList.remove('selected');
}
child.classList.add('selected');
});
}
//loop through all children
[...theChildren].forEach(selectChild);
</script>