在纯JavaScript中,如何找到最接近具有特定类的树的元素的祖先?例如,在这样的树中:
<div class="far ancestor">
<div class="near ancestor">
<p>Where am I?</p>
</div>
</div>
然后我想要div.near.ancestor
,如果我在p
上尝试这个并搜索祖先
。
使用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
这就是诀窍:
function findAncestor (el, cls) {
while ((el = el.parentElement) && !el.classList.contains(cls));
return el;
}
while循环等待el
拥有所需的类,并且它在每次迭代中将el
设置为el
的父级,因此最终,您将拥有该类的祖先或null
。
这是一把小提琴,如果有人想改进的话。它在旧浏览器(即IE)上不起作用;有关类列表,请参见此兼容性表<这里使用code>parentElement,因为parentNode
需要更多的工作来确保节点是一个元素。
更新:现在大多数主要浏览器都支持
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。