使用 Javascript 在 foreach 循环中使用 getElementsByClassName 切换 类

Toggle classes with getElementsByClassName inside a foreach loop with Javascript

我无法让这个切换 classes 脚本在所有项目 divs 中工作。

它被设置为当单击父元素时,两个子元素都会切换 class .hide,这更像是一个交换。

注意到这个使用 Jquery 的类似 post,我采用了不同的方法,因为在这种情况下有多个 class 需要更改。

我使用 getElementsByClassName 并将 NodeList 中的元素定义为 [0]。这适用于第一个项目 div 和第二个当更改为 [1].

但是,我一直在思考如何使它同时在所有后续项目 div 中发挥作用。这是用循环完成的吗?还是使用变量?或者使用 this 关键字?

我正在使用 Kirby CMS 生成内容部分,因此项目 divs 在 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>

有很多方法可以做到这一点。确保您将事件侦听器添加到所有 div 而不仅仅是第一个。 查看您当前的代码,您可以遵循这种方法。

this inside event listener 属于触发事件的元素。因此,当我们执行 this.getElementsByClassName 时,我们仅在该特定元素内查询 类。

getElementsByClassName 不是 return 数组。它 return 是一个 类数组 的集合。要在类似数组的对象上使用 forEach() ,需要将其转换为数组。使用 ...(扩展)运算符将集合转换为数组。

[...document.getElementsByClassName('read-more-div')].forEach(x => x.addEventListener('click', function() {

  this.getElementsByClassName('read-more-btn1')[0].classList.toggle('hide');
  this.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>