【问题标题】:Parent Selector of Several Elements Back [duplicate]几个元素的父选择器返回[重复]
【发布时间】:2020-02-16 04:47:54
【问题描述】:

我不知道如何从具有特定标题属性的特定元素中选择一个元素(返回几个元素)。

例如,使用以下示例代码,我试图定位第一个 <renderer> 元素...

<renderer class="scope">
   <div id="content" class="scope">
      <renderer class="scope">
         <div class="scope">
            <div id="details" class="scope">
               <a title="Foo Bar" href="#">LINK TEXT</a>
            </div>
         </div>
      </renderer>
   </div>
</renderer>

我尝试了很多变化,包括这个......

renderer:has a[title*="Foo Bar"] {
    opacity: 0.2 !important;
}

我尝试过的其他事情甚至都没有接近工作(甚至是 JavaScript)......但可能是因为我在这里或其他网站上找到的每个答案都与这个问题没有足够的关系来解决这个问题。

如果链接标题中包含特定文本,我如何定位和设置第一个 &lt;renderer&gt; 元素(或至少后两层)的样式?

【问题讨论】:

    标签: css css-selectors parent


    【解决方案1】:

    没有办法在 CSS 中选择父元素。您可以使用 javascript 来达到预期的效果。

    你可以这样做

    let anchor = document.querySelector('a[title="Foo Bar"]');
    anchor.closest('renderer').style.opacity = 0.2;
    

    如果要选择文档中的所有元素,可以使用 querySelectorAll ,例如:

    let anchors = document.querySelectorAll('a[title="Foo Bar"]');
    anchors.forEach(function (anchor) {
        anchor.closest('renderer').style.opacity = 0.2;
    });
    

    注意:closest() 在 IE 中不起作用,因此您可能需要添加它的 polyfill 或改用 parentNode。

    【讨论】:

    • 我正在寻求任何一种方法的帮助。那你能帮我看看如何用javascript做到这一点吗?
    • 我已经更新了答案。请试试这个,让我知道这是否有帮助。或者查看这个 JSFiddle jsfiddle.net/kawal/z9qepbc7
    • 关闭,但它只获得页面上的第一个匹配项。我需要它在一个页面中多次出现。
    • 您可以使用 querySelectorAll 从页面中获取所有元素并循环遍历每个元素并设置该元素的样式。请检查更新的答案或检查这个小提琴jsfiddle.net/kawal/z9qepbc7/9
    【解决方案2】:

    截至 2020 年 2 月,:has CSS 伪类目前不受任何浏览器支持。


    JS解决方案

    如果您不确定 renderer 的 DOM 有多高,您可能需要递归调用 Element.closest() 才能找到它。

    function getHighestRenderer(el) {
      const closestRenderer = el.parentNode.closest("renderer");
      if (closestRenderer) {
        return getHighestRenderer(closestRenderer);
      }
      return el;
    }
    
    const titleToMatch = "Foo Bar";
    const detailsLinks = document.querySelectorAll(".details a");
    
    detailsLinks.forEach(link => {
      if (titleToMatch === link.getAttribute("title")) {
        getHighestRenderer(link).classList.add("foobar");
      }
    });
    .foobar {
      border: 1px dotted blue;
      padding: 10px;
      display: block;
    }
    <renderer class="scope">
      <div id="content" class="scope">
        <renderer class="scope">
          <div class="scope">
            <div id="" class="details scope">
              <a title="Not Foo Bar" href="#">LINK TEXT  - title: Not Foo Bar</a>
            </div>
          </div>
        </renderer>
      </div>
    </renderer>
    
    
    <renderer class="scope">
      <div id="content" class="scope">
        <renderer class="scope">
          <div class="scope">
            <div id="" class="details scope">
              <a title="Not Foo Bar" href="#">LINK TEXT - title: Not Foo Bar</a>
            </div>
          </div>
        </renderer>
      </div>
    </renderer>
    
    <renderer class="scope">
      <div id="content" class="scope">
        <renderer class="scope">
          <div class="scope">
            <div id="" class="details scope">
              <a title="Foo Bar" href="#">LINK TEXT - title: Foo Bar</a>
            </div>
          </div>
        </renderer>
      </div>
    </renderer>

    【讨论】:

    • 似乎对我的不起作用...但是令人困惑的是,因为它确实在这里起作用并且代码是相同的。
    • 看看&lt;div class="details" vs &lt;div id="details"
    • 我也已经考虑过了。
    • 哪一部分不起作用?您在控制台中看到任何错误吗?
    • 没有看到任何错误,我不知道您所说的“哪一部分”是什么意思。只有一个部分。它只是行不通。不判断您的代码或任何东西,因为显然您的代码工作正常,如本网站所示,但控制台没有给我任何错误的事实就是为什么我遇到这样的问题,指出为什么它不会做任何类似的事情它在这里。
    猜你喜欢
    • 2023-03-20
    • 2022-01-01
    • 2015-08-06
    • 2012-08-08
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多