【问题标题】:querySelectorAll and multiple elements with the same classquerySelectorAll 和具有相同类的多个元素
【发布时间】:2020-01-20 09:15:43
【问题描述】:

我目前正在尝试调整 this demo 在您单击应用了相同类的链接时进行页面转换。

我不确定如何为使用querySelectorAll 后具有相同类的所有元素调整以下代码。您认为应该进行哪些调整以使其与 querySelectorAll 和具有同一类的多个元素一起使用?

(function() {
  const elmHamburger = document.querySelector('.link-with-overlay');
  const elmOverlay = document.querySelector('.shape-overlays');
  const overlay = new ShapeOverlays(elmOverlay);

  elmHamburger.addEventListener('click', () => {
    if (overlay.isAnimating) {
      return false;
    }
    overlay.toggle();
    if (overlay.isOpened === true) {
      elmHamburger.classList.add('is-opened-navi');

    } else {
      elmHamburger.classList.remove('is-opened-navi');

    }

谢谢!

【问题讨论】:

  • 与您的主要问题无关,但值得一提:如果您关心基本查找的性能(仅按类名),则有 much faster 选项 - document.getElementsByClassName()
  • 如果您正在寻找一种方法来查询 all 匹配项,我猜您正在考虑 querySelectorAll() 这不是该工作的最佳人选(见我之前的评论)。
  • 谢谢!会看看document.getElementsByClassName()

标签: javascript jquery svg


【解决方案1】:

要让所有链接都具有 onclick 事件,您需要遍历 querySelectorAll 方法返回的 NodeList

注意:您不能在 IE11 中执行 NodeList.forEach,因此您需要在迭代之前对其进行 polyfill 或将其转换为真正的 JS 数组。

(function() {
  const elmHamburgers = document.querySelectorAll('.link-with-overlay');
  const elmOverlay = document.querySelector('.shape-overlays');
  const overlay = new ShapeOverlays(elmOverlay);

  const onHamburgerClick = function() {
    if (overlay.isAnimating) {
      return false;
    }
    overlay.toggle();
    if (overlay.isOpened === true) {
      this.classList.add('is-opened-navi');

    } else {
      this.classList.remove('is-opened-navi');
    }
  };

  // Iterates over all of the elements matched with class .link-with-overlay and 
  // adds an onclick event listener

  elmHamburgers.forEach(elem => elem.addEventListener('click', onHamburgerClick));

})();

您也可以替换条件:if (overlay.isOpened === true) {... 使用this.classList

this.classList.toggle('is-opened-navi', overlay.isOpened)

【讨论】:

  • 嘿@ourmaninamsterdam!谢谢你的建议。您能否看到我的回答,其中包括您所拥有的,因为我目前无法使其工作?
  • 您有语法错误。删除}()); 上方的两行(带括号)。在单独的说明中,最好在评论中链接到任何代码示例作为 jsfiddles,而不是发布新答案。
  • 哦,对了!非常感谢!它现在工作得很好。下次会小心你关于 cmets 的注释。我是论坛的新手,会及时改进我的礼仪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多