【问题标题】:How to make a selector for direct child of the root node?如何为根节点的直接子节点制作选择器?
【发布时间】:2020-01-09 17:49:30
【问题描述】:

考虑给您一个节点node,并且您必须提供选择器Direct 给出的所有直接子节点。直接子代的选择器是:

childParent > directChild

但是,以下操作失败并在控制台中出现错误:

document.body.querySelectorAll(">div")
SyntaxError: '>div' is not a valid selector

我有一个函数需要在选择的直接子节点上执行某些操作,但我不确定如何处理。当然除了使用for 循环并用我自己的代码分析孩子,完全放弃选择器。

以下代码不起作用。是否可以对其进行更改以达到预期目的?

function doWithDirectChildren(parentNode) {
    // does not work, the selector is invalid
    const children = parentNode.querySelector(">.shouldBeAffected");
    for(const direct of children) {
        // do something with the direct child
    }
}

我要求的是解决方案,而不是解决方法。

【问题讨论】:

  • 什么是根节点?身体?
  • 如果总是body 你可以document.querySelectorAll('body > div')
  • jQuery 解决了这个问题api.jquery.com/children
  • 如果不包括 jQuery,我想说@JeffreyWesterkamp 的评论是要走的路。

标签: javascript queryselector


【解决方案1】:

正确的方法是使用:scope psuedo 类。

根据 MDN 上的documentation

当从诸如 querySelector()、querySelectorAll()、matches() 或 Element.closest() 等 DOM API 使用时,:scope 匹配调用该方法的元素。

例如:

let parent = document.querySelector('#parent');
let scoped = parent.querySelectorAll(':scope > span');

Array.from(scoped).forEach(s => {
  s.classList.add('selected');
});
.selected {
  background: yellow;
}
<div id="parent">
  <span> Select Me </span> <br>
  <span> Me Too </span>
</div>
<span> Not Selected </span>

【讨论】:

    【解决方案2】:

    child combinator 运算符 &gt; 是一个二元运算符,因此在左侧没有任何内容的情况下使用它是无效的。

    子组合符 (>) 放置在两个 CSS 选择器之间。它 仅匹配与第二个选择器匹配的那些元素 第一个匹配的元素的直接子元素。

    如果您可以提供单独的 parentchild 选择器,您可以执行类似这样的简单操作

    let directChildren = (parent, child) => document.querySelectorAll(`${parent} > ${child}`);
    directChildren('body','div');//...
    

    如果您的父参数是节点或集合,您必须使用一种方法将其转换回选择器,like this one

    【讨论】:

      【解决方案3】:

      jQuery 以两种方式解决了这个问题。考虑这段代码:

      $('div.root').find('> .p2').addClass('highlighted');
      $('div.root').children('.p2').addClass('red');
      .highlighted {
        background: yellow
      }
      
      .red {
        color: red
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div class="root">
        <p>div 1</p>
        <p class="p2">paragraph 2</p>
        <p>paragraph 3</p>
        
        <div>
          <p class="p2">paragraph 2 2</p>
        </div>
      </div>

      使用.find('&gt; selector) 仅查找与选择器匹配的直接子级,使用.children('selector') 也可以做到这一点。

      【讨论】:

      • 该问题未标记jquery,恕我直言,仅针对此问题添加 JQuery 将是矫枉过正。 (此外,我认为在 2020 年为任何问题添加它都是矫枉过正的。但这只是我的看法)
      • 我的大部分项目都使用 React,因此不需要任何 dom 选择逻辑。但毫无疑问,如果你需要复杂的 dom 操作,jQuery 仍然提供了最好的 api,比浏览器默认提供的工具要好得多(即使有 es6 功能)
      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多