【问题标题】:How to Select Element That Does Not have parent Class in "pure" JS?如何在“纯”JS中选择没有父类的元素?
【发布时间】:2020-11-04 18:17:39
【问题描述】:

除了包含在 .toc-excluded

我试过了

const headings = document.querySelectorAll(
  ".article--full :not(.toc-excluded) h2, .article--full :not(.toc-excluded) h3"
);
headings.forEach(hd => hd.classList.add("red"))
.red {
  color: red;
}
<div class='article--full'>
  <div>many divs in between</div>
  <div class='toc-excluded'>
    <div>many divs in between</div>
    <h2>h2</h2>
    <h3>h3</h3>
  </div>
  <div>many divs in between</div>
  <div class='manyotherdivs'><h2>h2</h2></div>
   <div class='manyotherdivs'><h3>h3</h3></div>
</div>

【问题讨论】:

  • 我给你做了minimal reproducible example你也可以这样做
  • 我不知道 CSS 选择器是否能够单独执行此操作。它不是为这种场景设计的。您可能只需要获取所有 h2/h3 并在代码中检查它们的父级
  • 您当前的代码 sn-p 似乎可以正常工作。它被编辑了几次,这仍然准确地描述了你的场景吗?
  • @3limin4t0r 当前的 sn-p 选择最后两个 H* 元素,我已经理解了这个问题,前两个 h* 元素应该从 NodeList 中排除,即除第一个之外的所有元素两个 H*s 应该显示为红色。
  • @Teemu 我不太明白。它似乎依赖于介于两者之间的一些 div。为什么 .toc 排除的 h3 未在此处排除 codepen.io/matoeil/pen/eYJLPjP

标签: javascript selectors-api


【解决方案1】:

:not 的所有语法还没有完全支持,因此最好还是依赖旧的好 JS。正如利亚姆建议的那样,您必须过滤要从列表中排除的元素,如下所示:

const headings = Array.from(
    document.querySelectorAll('.article--full h2, .article--full h3')
  ).filter(el => !el.closest('.toc-excluded'));

headings.forEach(hd => hd.classList.add("red"));
.red {
  color: red;
}

h2,
h3 {
  color: black;
}
<div class="article--full">
  <div>many divs in between</div>
  <div class="toc-excluded">
    <div>many divs in between</div>
    <h2>h2</h2>
    <h3>h3</h3>
  </div>
  <div>many divs in between</div>
  <div class="manyotherdivs">
    <h2>h2</h2>
  </div>
  <div class="manyotherdivs">
    <h3>h3</h3>
  </div>
</div>

返回的NodeList必须在过滤前转换为数组,因为列表本身是只读的,不支持filter方法。 header 元素需要自己的 CSS,否则字体颜色会被继承,不会有任何视觉差异。

【讨论】:

  • div 不应该是红色的,因为没有标题
  • 作为对Teemu回复的补充,一旦节点列表转换为数组codepen.io/matoeil/pen/BajOGMq,我已经对自己进行了排序
  • @Matoeil 问题是“如何排除.toc-excluded中包含的h2和h3”,没有其他条件。请更准确地描述想要的结果,我可以相应地修复答案。
  • 我已经编辑了这个问题,试图更精确
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2019-08-14
  • 2015-03-13
  • 2020-09-13
  • 1970-01-01
  • 2021-03-23
相关资源
最近更新 更多