var courses = document.getElementsByClassName('course');
for(var i = 0; i < courses.length; i++) {
courses[i].addEventListener('click', function() {
if(this.classList.contains('active-course')) {
this.classList.remove('active-course');
} else {
this.classList.add('active-course');
}
});
}
上面的代码在包含类“course”的所有元素上添加了一个事件监听器,这样当单击带有类的元素时,如果已经有类“course-active”,则将其添加到其中或删除它。
我想要的是也可以通过点击获得“课程有效”类的所有元素。
当我在click事件函数中添加以下代码时(在if else之后),它会记录0
console.log(document.getElementsByClass('course-active').length);
// The problem was the typo after all!
// Read EDIT 2 below for more information
该课程已添加,我使用chrome devtools进行了检查 为什么没有找到元素?
<div class="card h-100 course">
<div class="card-block">
<h4 class="card-title">AMAT122</h4>
<p class="card-text">Calculus and Analytic Geometry II</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">General Department</li>
</ul>
</div>
<div class="card h-100 course">
<div class="card-block">
<h4 class="card-title">AMAT122</h4>
<p class="card-text">Calculus and Analytic Geometry II</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">General Department</li>
</ul>
</div>
我上面提到的要素。
问题毕竟是一个错字!
getElementsByClass()
而不是getElementsByClassName()
.course-active
而不是。{
active-course
Ooopsy!我想我需要给自己一些咖啡,呵呵
答案 0 :(得分:2)
document.getElementsByClass
不正确。
尝试document.getElementsByClassName
您在示例中要查找的类名也不正确。当您设置的班级名称为course-active
时,您正尝试获取名为active-course
的元素。
答案 1 :(得分:1)
您使用getElementsByClass
代替getElementsByClassName
。此外,班级名称course-active
不是您添加的名称。请考虑以下代码段:
var courses = document.getElementsByClassName('course');
for(var i = 0; i < courses.length; i++) {
courses[i].addEventListener('click', function() {
if(this.classList.contains('active-course')) {
this.classList.remove('active-course');
} else {
this.classList.add('active-course');
}
console.log(document.getElementsByClassName('active-course').length);
});
}
<div class="card h-100 course">
<div class="card-block">
<h4 class="card-title">AMAT122</h4>
<p class="card-text">Calculus and Analytic Geometry II</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">General Department</li>
</ul>
</div>
<div class="card h-100 course">
<div class="card-block">
<h4 class="card-title">AMAT122</h4>
<p class="card-text">Calculus and Analytic Geometry II</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">General Department</li>
</ul>
</div>
答案 2 :(得分:1)
您需要确保引用正确的类名。在某些情况下,您陈述course-active
,而在其他情况下,您陈述active-course
。此外,您使用的是.getElementsByClass()
,而不是.getElementsByClassName()
。
但是, .getElementsByClassName()
不适合大多数用例,因为它会返回&#34; live&#34;节点列表,虽然确保始终引用具有某个类的所有项目,但会导致它比静态项目更糟糕,因为它必须在每次访问变量时重新扫描文档。在大多数情况下, .querySelectorAll()
会更好。
此外,如果将节点列表转换为数组,则可以使用更简单的 .forEach()
方法迭代数组中的元素。
最后,不要测试类的每个元素,然后手动添加或删除它,只需使用 .classList.toggle()
方法。
最终的解决方案更有效,更简单:
// Get all the elements with the course class into an array
var courses = Array.prototype.slice.call(document.querySelectorAll('.course'));
// Loop through the array with the more modern and simpler Array.forEach()
courses.forEach(function(course){
course.addEventListener('click', function() {
// Just toggle the use of the class instead of testing for it
course.classList.toggle('active-course');
});
});
&#13;
.course { cursor:pointer; }
.active-course { color:red; }
&#13;
<div class="card h-100 course">
<div class="card-block">
<h4 class="card-title">AMAT122</h4>
<p class="card-text">Calculus and Analytic Geometry II</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">General Department</li>
</ul>
</div>
<div class="card h-100 course">
<div class="card-block">
<h4 class="card-title">AMAT122</h4>
<p class="card-text">Calculus and Analytic Geometry II</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">General Department</li>
</ul>
</div>
&#13;