javascript - 我无法在点击时为文本着色

标签 javascript html

当您单击某个类别时,其名称应变为红色。但这仅适用于预渲染类别,如果您添加一个新类别(它适用于输入和“添加 btn”),则事件处理程序不起作用,文本不会发生任何情况

// * Adding active class for the cat
const addActiveClass = (elem) => {
  elem.classList.add("active");
};
// ! Removing active class
const removeActiveClass = (catArr) => {
  Array.from(catArr).forEach((elem) => {
    elem.classList.remove("active");
  });
};

Array.from(document.getElementsByClassName("categories__text")).forEach(
  (elem) => {
    elem.addEventListener("click", (e) => {
      removeActiveClass(document.getElementsByClassName
      ("categories__text"));
      addActiveClass(e.target);
    });
  }
);
console.log(Array.from(document.getElementsByClassName("categories__text")));
<ul class="categories__list">
  <li class="categories__item">
    <p class="categories__text active">All</p>
  </li>
</ul>

最佳答案

您的问题源于动态添加的元素没有与最初存在的元素相同的事件监听器。该解决方案涉及使用事件委托(delegate),将事件监听器附加到父元素,然后验证单击的元素是否符合您的要求。看这里:

// Adding and removing active class
const toggleActiveClass = (elem) => {
  Array.from(document.getElementsByClassName("categories__text")).forEach((el) => {
    el.classList.remove("active");
  });
  elem.classList.add("active");
};

// Here Goes Event delegation
document.querySelector('.categories__list').addEventListener('click', (e) => {
  if (e.target && e.target.matches(".categories__text")) {
    toggleActiveClass(e.target);
  }
});

这样,即使稍后添加的元素也将具有单击功能,因为事件监听器位于父元素上,而不是单个元素上。

希望这有帮助!

关于javascript - 我无法在点击时为文本着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76844724/

相关文章:

javascript - Vue : Make matching part of input bold, 包括特殊连字符

javascript - 如何阻止 Flot Charts 重新排序我的数据?

javascript - 我多久可以重命名一次不和谐 channel 的名称?

html - 有没有一个好的开源谷歌地图风格 <canvas> 图像组件?

html - 如何在具有透明背景的 Three.js Canvas 上绘制 <div> 元素?

php - 如何将 html 和 css 转换为图像?

javascript - 引用错误 : Chart is not defined - chartjs

javascript - 从对象数组中查找对象索引的最佳方法是什么 - javascript

javascript - jQuery 淡入淡出循环问题

javascript - Jquery 循环问题