javascript - 如何使用 CSS 选择器获取除特定子元素之外的所有匹配元素?

标签 javascript html css css-selectors queryselector

假设 HTML 结构如下所示:

<div id="container">
     <div class="A">
         <div id="excludedElement">
             <p>
                 <span class="MyClass">1</span>
                 <span class="MyClass">2</span>
                 <span class="MyClass">3</span>
             </p>
         </div>
     </div>
     <div class="B">
         <p>
             <span class="MyClass">4</span>
             <span class="MyClass">5</span>
             <span class="MyClass">6</span>
         </p>
     </div>
</div>

我想要“container”div 中具有类“MyClass”的所有元素,“excludedElement”div 中的元素除外。在本例中,结果仅包含跨度 4、5 和 6。

我当前的解决方案是首先获取带有“MyClass”的所有元素,然后获取带有“MyClass”的exclusionElement 内的所有元素。对于第一个列表中的每个元素,我们检查它是否在第二个列表中,如果是则跳过它。这是 O(n^2) 运行时间,所以我想避免这种情况。伪代码供引用:

const allElements = container.querySelectorAll('.MyClass');
const excludedElements = container.querySelectorAll('#excludedElement .MyClass');
var result = [];

for (const element in allElements)
{
    if (!excludedElements.Contains(element))
    {
        result.Add(element);
    }
}

有没有办法在 querySelectorAll() 中制作一个可以检索该特定元素集的 CSS 选择器?

一种方法是暂时从树中删除排除元素,查询“MyClass”,然后替换排除元素,但我想避免修改 DOM。

最佳答案

如果结构是可预测的并且已知的:

container.querySelectorAll('div:not(#excludedElement) > p .MyClass');

如果结构未知,并且您可以添加类以避免 O(n^2):

container.querySelectorAll('#excludedElement .MyClass')
    .forEach(element => element.classList.add('excluded'));

const notExcludedMyClassElements = container.querySelectorAll('.MyClass:not(.excluded)');

关于javascript - 如何使用 CSS 选择器获取除特定子元素之外的所有匹配元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889104/

相关文章:

javascript - polymer 的日期输入字段?

javascript - 如何使用jquery在没有iframe的情况下获取body的innerHtml

html - 单击悬停错误(chrome)

javascript - 如何获得 previous sibling 姐妹的名字

javascript - 错误: Cannot find module './'

javascript - JQuery 使用计时器在 for 循环中更改 CSS

HTML5 - Chrome 中的 SVG 文本选择错误?

php - 广告列表未显示在 PHP 中

javascript - 无法设置未定义的属性 'class'

javascript - PDFJS.PDFLinkService 不是一个函数