【问题标题】:Querying Html Hierarchy using advanced logic使用高级逻辑查询 Html 层次结构
【发布时间】:2018-06-21 14:42:34
【问题描述】:

给定html:

<div data-root="A">
 <div>Ignored</div>
 <div data-child="B">
  <div data-child="C" data-root="E">
    <div data-child="F"></div>
    <div data-child="G">
     <div data-root="Q">
      <div data-child="K"></div>
     </div>
    </div>
  </div>
 </div>
</div>

对于任何给定元素(根),我想查询所有填充了 data-child 属性且不属于另一个指定了 data-root 的元素的子元素。

样本结果:

  • 数据根 A:数据子项:B、C
  • 数据根 E:数据子项:F、G、Q
  • 数据根 Q:数据子项:K

我通过调用root.querySelectorAll("[data-child]") 解决了这个问题,然后通过跟踪它到父元素来单独检查每个元素,同时检查是否有任何元素指定了data-root。它可以工作,但是代码对于它正在做的事情有点尴尬。理想情况下,我正在寻找一种无代码的声明性解决方案,任何人都可以为我的问题想出它吗?

【问题讨论】:

    标签: html css-selectors selectors-api


    【解决方案1】:

    唯一可用的基于选择器的解决方案,形式为

    root.querySelectorAll("[data-child]:not(:scope [data-root] *)")
    

    使用 not yet supported by all browsers 的选择器级别 4 功能,因此可能无法满足您的需求。选择器级别 3 中没有这样的解决方案。

    【讨论】:

    • 很公平。我会试一试。如何在 Js 中测试对 Level 4 的支持以创建后备?
    • @Simple.Js:我错过了你之前的评论。您可以通过将此选择器放在 try {} 中并将后备放在 catch {} 中来进行测试。不幸的是,不知道 Chrome 何时计划支持它。
    【解决方案2】:

    另一种不太受支持的方法是将 Element 方法 closest 与相关选择器一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 2020-04-17
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多