当前位置: 首页 > 知识库问答 >
问题:

查找具有特定类的最近祖先元素

傅志文
2023-03-14

在纯JavaScript中,如何找到最接近具有特定类的树的元素的祖先?例如,在这样的树中:

<div class="far ancestor">
    <div class="near ancestor">
        <p>Where am I?</p>
    </div>
</div>

然后我想要div.near.ancestor,如果我在p上尝试这个并搜索祖先

共有3个答案

丌官高远
2023-03-14

使用element.closest()

https://developer.mozilla.org/en-US/docs/Web/API/Element/closest

请参见以下示例:

<article>
  <div id="div-01">Here is div-01
    <div id="div-02">Here is div-02
      <div id="div-03">Here is div-03</div>
    </div>
  </div>
</article>

这就是你如何使用element.closest:

var el = document.getElementById('div-03');

var r1 = el.closest("#div-02");  
// returns the element with the id=div-02

var r2 = el.closest("div div");  
// returns the closest ancestor which is a div in div, here is div-03 itself

var r3 = el.closest("article > div");  
// returns the closest ancestor which is a div and has a parent article, here is div-01

var r4 = el.closest(":not(div)");
// returns the closest ancestor which is not a div, here is the outmost article
关志勇
2023-03-14

这就是诀窍:

function findAncestor (el, cls) {
    while ((el = el.parentElement) && !el.classList.contains(cls));
    return el;
}

while循环等待el拥有所需的类,并且它在每次迭代中将el设置为el的父级,因此最终,您将拥有该类的祖先或null

这是一把小提琴,如果有人想改进的话。它在旧浏览器(即IE)上不起作用;有关类列表,请参见此兼容性表<这里使用code>parentElement,因为parentNode需要更多的工作来确保节点是一个元素。

诸葛雨泽
2023-03-14

更新:现在大多数主要浏览器都支持

document.querySelector("p").closest(".near.ancestor")

请注意,这可以匹配选择器,而不仅仅是类

https://developer.mozilla.org/en-US/docs/Web/API/Element.closest

对于不支持closest()但具有matches()的旧式浏览器,可以构建类似于@rvighne的类匹配的选择器匹配:

function findAncestor (el, sel) {
    while ((el = el.parentElement) && !((el.matches || el.matchesSelector).call(el,sel)));
    return el;
}
 类似资料:
  • 问题内容: 如何 在纯JavaScript中 找到与具有特定类的树最接近的元素的原型?例如,在像这样的树中: 然后,我想在上尝试并搜索。 问题答案: 更新:大多数主流浏览器现在都支持 请注意,这可以匹配选择器,而不仅仅是类 https://developer.mozilla.org/zh- CN/docs/Web/API/Element.closest 对于不支持但拥有一个的旧版浏览器,可以构建类

  • 我正在尝试查找一个XPath查询以获取元素的祖先,它是一个,具有。 我做错了什么?

  • 问题内容: 我试图找到没有jquery的具有特定标签名称的最接近的元素。当我单击a时,我想访问该表的。有什么建议吗?我读过有关偏移量的信息,但并不太了解。我应该只使用: 假设已经设置了单击元素 问题答案: 参加聚会的时间很少(非常),但是仍然如此。这应该做的伎俩:

  • 问题内容: 这是我可以使用的粗糙html: 我需要从中遍历,找到最接近的前一个并对其进行处理。 返回的全部负载(我在页面上大约有30个)。我需要瞄准一个。 非常感谢任何提示:) 问题答案: 尝试: 用您的标记测试了它: 将用“ woohoo” 填充最接近的前一个。

  • 问题内容: 这让我发疯: HTML: CSS: 这不是读到“选择所有祖先不是元素的元素吗?”。因此,“ Hello World!” 不应显示为红色,但仍然是。 对于上述标记,添加子组合器的工作原理是: 但是,如果它不是元素的子元素,则不会影响元素。例如: 这就是为什么我想将元素表示为元素的后代而不是子元素。任何人? 问题答案: 这不是读到“选择所有祖先不是元素的元素吗?”。 是的 但是在一个典型的

  • 我正在编写一些Selenium测试,我需要能够找到我已经找到的的祖先。 这是我正在尝试的,但没有任何结果 下面的图像显示了我选择的div,突出显示为深蓝色,并且显示了我想用箭头指向它的div。