jQuery中最近的祖先节点

Posted

技术标签:

【中文标题】jQuery中最近的祖先节点【英文标题】:nearest ancestor node in jQuery 【发布时间】:2010-09-17 02:38:29 【问题描述】:

在我的 javascript 经验中,我发现这是一个非常常见的任务“搜索具有某些条件(标签名称、类...)的元素的最近祖先”。 jquery 的 parents() 方法可以完成这项工作吗? parents() 的返回元素的顺序是可预测的吗?是自上而下还是自下而上? 目前我使用这个实用功能:

function ancestor(elem, selector) 
  var $elem = $( elem ).parent();
  while( $elem.size() > 0 ) 
    if( $elem.is( selector ) ) 
    return $elem;
    else
       $elem = $elem.parent();
  
  return null;

谁能告诉我是否有聪明的方法来完成这项工作?

【问题讨论】:

【参考方案1】:

编辑:从 jQuery 1.3 开始,它被内置为 closest() 函数。例如:$('#foo').closest('.bar');


是的 - parents() 遍历树。

<div id="a">
    <div id="b">
        <p id="c">
            <a id="d"></a>
        </p>
    </div>
</div>

$('#d').parents("div:first"); 将选择 div b。

【讨论】:

当心,John Resig 计划更改 .parents() 以按源顺序返回元素。在论坛主题围绕返回集合中的元素顺序旋转后,请参阅 John 本人提交的此错误:bugs.jquery.com/ticket/5994 幸运的是,jQuery 团队已经用wontfix 关闭了这张票。所以 .parents() 应该再次被认为是稳定的。【参考方案2】:

添加到@nickf的答案:

jQuery 1.3 用closest 简化了这个任务。

给定一个 DOM:

<div id="a">
    <div id="b">
        <p id="c">
            <a id="d"></a>
        </p>
    </div>
</div>

你可以这样做:

$('#d').closest("div"); // returns [ div#b ]

[Closest 返回一个] 集合 包含最近父元素的元素 与指定匹配的元素 选择器,起始元素 包括在内。

【讨论】:

.closest() 的问题在于它从当前元素开始。来自jQuery site:“获取与选择器匹配的第一个元素,从当前元素开始,向上遍历 DOM 树。”一般来说,这不会正确回答问题,因为它只是在寻找祖先元素。【参考方案3】:

您应该使用closest,因为如果您使用多个元素,parents 不会给您预期的结果。例如,假设你有这个:

    <div id="0">
        <div id="1">test with <b>nested</b> divs.</div>
        <div id="2">another div.</div>
        <div id="3">yet <b>another</b> div.</div>
    </div>

并且您想将一个类添加到具有&lt;b&gt; 元素作为其直接子元素的 div(即 1 和 3)。如果你使用$('b').parents('div'),你会得到div 0、1和3。如果你使用$('b').parents('div:first'),你只会得到div 1。要得到1和3,而不是0,你必须使用$('b').closest(elem)

【讨论】:

.closest() 的问题在于它从当前元素开始。来自jQuery site:“获取与选择器匹配的第一个元素,从当前元素开始,向上遍历 DOM 树。”一般来说,这不会正确回答问题,因为它只是在寻找祖先元素。【参考方案4】:

closest() 从当前元素开始,如果您要查找的父元素与当前元素具有相同的标签(例如,两者都是 div),请使用 parent().closest()

【讨论】:

以上是关于jQuery中最近的祖先节点的主要内容,如果未能解决你的问题,请参考以下文章

leetcoe/二叉树/最近公共祖先/序列号反序列化

LCA(最近公共祖先)——离线 Tarjan 算法

LintCode 最近公共祖先

236. 二叉树的最近公共祖先[中等]

最近公共祖先 LCA 递归非递归

leetcode-236二叉树的最近公共祖先