【发布时间】:2021-09-25 11:48:58
【问题描述】:
我无法让这个切换类脚本在所有项目 div 中工作。
它的设置是,当单击父元素时,两个子元素都会切换类.hide,它的功能更像是交换。
注意到这个使用 Jquery Toggle classes inside a foreach loop 的类似帖子,我采取了不同的方法,因为在这种情况下有多个类需要更改。
我使用getElementsByClassName 并将NodeList 中的元素定义为[0]。这适用于第一个项目 div 和更改为 [1] 的第二个。
但是,我一直坚持如何在所有后续项目 div 中同时进行这项工作。这是用循环完成的吗?还是使用变量?还是使用this 关键字?
我正在使用 Kirby CMS 生成内容部分,因此项目 div 模板在 foreach 循环内。
document.getElementsByClassName('read-more-div')[0].addEventListener('click', function() {
document.getElementsByClassName('read-more-btn1')[0].classList.toggle('hide');
document.getElementsByClassName('read-more-btn2')[0].classList.toggle('hide');
return false
})
body {
background-color: #000000;
color: #ffffff;
}
p,
button {
background-color: #000000;
color: #ffffff;
border: none;
padding: 0;
margin: 0;
}
.read-more-btn1 {
color: #888888;
cursor: s-resize;
}
.read-more-btn2 {
cursor: n-resize;
}
.read-more-btn1:hover {
color: #ffffff;
}
.hide {
display: none;
}
<div>Project A
<div class="read-more-div">
<button class="read-more-btn1">Read more...</button>
<p class="read-more-btn2 hide">Toggle this project text</p>
</div>
</div>
<div>Project B
<div class="read-more-div">
<button class="read-more-btn1">Read more...</button>
<p class="read-more-btn2 hide">Toggle this project text</p>
</div>
</div>
<div>Project C
<div class="read-more-div">
<button class="read-more-btn1">Read more...</button>
<p class="read-more-btn2 hide">Toggle this project text</p>
</div>
</div>
【问题讨论】:
-
使用event delegation而不是分配多个事件监听器 — 它更易于维护,并且适用于动态添加的元素。例如,使用event argument 的
target。见the tag info 和What is DOM Event delegation?。 -
类似
addEventListener("click", ({ target }) => { if(target.closest(".read-more-div")){ target.querySelectorAll(".read-more-btn1, .read-more-btn2").forEach(({ classList }) => classList.toggle("hide")); } });。 -
请注意,
return false;可以删除。它什么也没做。 -
很高兴知道作为另一种方法!我将不得不阅读看起来更复杂的事件委托。我还处于学习js的早期阶段
-
sn-p 似乎不起作用,我还不知道为什么
标签: javascript html css getelementsbyclassname nodelist