我不使用Jquery也不想要,一旦下一个项目被同一类切换,我想再次切换一个类。因此,上一个课程将被删除。并且一次只打开一个类。
我尝试添加document.getElementsByClassName(".panel").removeClass("open");
该函数首先删除所有已切换的类(“打开”)
但这不起作用。
我尝试添加一个ID并尝试从该ID中删除一个类仍然无法正常工作
function toggleOpen() {
document.getElementsByClassName(".panel").removeClass("open");//this give me error
this.classList.toggle('open');
}
function toggleActive(e) {
if (e.propertyName.includes('flex')) {
this.classList.toggle('open-active');
}
}
const panels = document.querySelectorAll('.panel');
panels.forEach(panel => panel.addEventListener('click', toggleOpen));
panels.forEach(panel => panel.addEventListener('transitionend', toggleActive));
结果
Uncaught TypeError: document.getElementsByClassName(...).removeClass is not a function
答案 0 :(得分:1)
应该为classList.remove("open")
,而不是removeClass("open")
此外,由于getElementsByClassName
将返回元素集合,因此您无法一次将其全部从中移除,因此该操作将无效。
您必须为面板中的每个元素调用它。
Array.from(document.getElementsByClassName(".panel")).forEach(element => element.classList.remove("open"))
或者无需先将其转换为数组就可以
const panels = document.getElementsByClassName(".panel")
for (let panel of panels) {
panel.classList.remove("open")
}
答案 1 :(得分:1)
由于您要向每个元素添加事件侦听器,因此不需要document.getElementsByClassName(".panel").removeClass("open");
。函数内部的this
将引用被单击的元素。
removeClass
是jquery方法,将不可用。
document.getElementsByClassName
返回元素列表,因此您需要对其进行循环。
尝试以下示例。
function toggleColor() {
this.classList.toggle('red');
}
const panels = document.querySelectorAll('.panel');
panels.forEach(panel => panel.addEventListener('click', toggleColor));
.green {
color: green;
}
.red {
color: red;
}
<p class="panel green">H1<p>
<p class="panel red">H2<p>
<p class="panel green">H3<p>
<p class="panel red">H4<p>