【问题标题】:How do I get the n-th level parent of an element in jQuery?如何在 jQuery 中获取元素的第 n 级父级?
【发布时间】:2023-03-24 03:51:01
【问题描述】:

例如,当我想获取元素的第 3 级父级时,我必须写 $('#element').parent().parent().parent() 是否有更优化的方法?

【问题讨论】:

  • 我只想提供数字(级别)并获取元素,因为我的元素可能没有任何 calss id 或名称
  • 如果你打算重用这个功能,最佳的解决方案是制作一个jQuery插件。
  • 查看jsperf.com/jquery-get-3rd-level-parent 了解一些性能比较
  • 另一个好工具是“.closest()”函数。 $('li.item').closest('div') 将为您提供最接近 li.item 祖先的 DIV。当您不知道元素的级别,但您知道它的标记名/类/其他内容时,这很有用。

标签: javascript jquery parent


【解决方案1】:

由于parents() 返回的祖先元素是从最靠近外部的元素开始排序的,因此您可以将其链接到eq()

$('#element').parents().eq(0);  // "Father".
$('#element').parents().eq(2);  // "Great-grandfather".

【讨论】:

  • 我可以使用这个 $('#element').parents()[2] 吗?或者它必须通过 eq(2)
  • 这不适用于多个元素选择,更安全的方法是:$('.element').first().parents().eq(num);
  • @Arthur,使用[2] 将返回底层DOM 元素,使用eq(2) 将返回一个jQuery 对象。
  • @zzzzBov,非常正确,但是在提问者的情况下只会选择一个元素(因为他匹配一个id)。
  • 如果您查找 id "#element" 它只会返回一个元素,因为这就是 ID 查找的工作方式,它们会返回 dom 中具有该 ID 的第一个元素。另一方面,如果你做了“div#element”或类选择器,那你是对的。
【解决方案2】:

取决于您的需要,如果您知道要寻找的父母,您可以使用 .parents() 选择器。

例如: http://jsfiddle.net/HenryGarle/Kyp5g/2/

<div id="One">
    <div id="Two">
        <div id="Three">
            <div id="Four">

            </div>
        </div>
    </div>
</div>


var top = $("#Four").parents("#One");

alert($(top).html());

使用索引的示例:

//First parent - 2 levels up from #Four
// I.e Selects div#One
var topTwo = $("#Four").parents().eq(2);

alert($(topTwo ).html());

【讨论】:

  • 我现在这样,但我想给等级
  • 进一步阅读答案,一切都会揭晓! (我已经给了你级别的例子)
  • 这适用于所有其他类型的选择器。例如,如果您想要某个班级的所有父母和父母的父母的列表,这将返回它们。
【解决方案3】:

您可以为目标父级提供一个 id 或类(例如 myParent),并且引用是 $('#element').parents(".myParent")

【讨论】:

  • 我只想给出数字并获取元素,因为我的元素可能没有任何 cals id 或名称
【解决方案4】:

一种更快的方法是直接使用javascript,例如。

var parent = $(innerdiv.get(0).parentNode.parentNode.parentNode);

这在我的浏览器上运行速度明显快于链接 jQuery .parent() 调用。

见:http://jsperf.com/jquery-get-3rd-level-parent

【讨论】:

  • 通过“明显更快”,我们在速度差异方面看到了大约一个数量级(在 Chrome 51 上运行 jQuery 1.10.1)。如果您正在调整速度,绝对值得实施。
【解决方案5】:

使用closest() 找不到任何答案 我认为当您不知道所需元素有多少级别时,这是最简单的答案,所以发布一个答案:
可以使用closest()函数结合选择器来获取从元素向上遍历时匹配的第一个元素:

('#element').closest('div')    // returns the innermost 'div' in its parents
('#element').closest('.container')    // returns innermost element with 'container' class among parents
('#element').closest('#foo')    // returns the closest parent with id 'foo'

【讨论】:

    【解决方案6】:

    这很简单。只需使用

    $(selector).parents().eq(0); 
    

    其中 0 是父级别(0 是父级,1 是父级的父级等)

    【讨论】:

      【解决方案7】:

      只需像这样添加:eq() 选择器:

      $("#element").parents(":eq(2)")
      

      您只需指定哪个父级的索引:0 代表直系父级,1 代表祖父级,...

      【讨论】:

      【解决方案8】:

      如果您打算重用此功能,最佳解决方案是制作一个 jQuery 插件:

      (function($){
      $.fn.nthParent = function(n){
        var $p = $(this);
        while ( n-- >= 0 )
        {
          $p = $p.parent();
        }
        return $p;
      };
      }(jQuery));
      

      当然,您可能希望扩展它以允许可选的选择器和其他类似的东西。

      注意:这使用基于0 的父母索引,因此nthParent(0) 与调用parent() 相同。如果您希望使用基于1 的索引,请使用n-- &gt; 0

      【讨论】:

      • 我认为您会更快地找到这部分:var p = 1 + n; while (p--) { $p = $p.parent(); } 如果您想更改为基于 1 的 JavaScript,您可以使用“错误”的 JavaScript:while (n--) { $p = $p.parent();} 保存条件检查
      • @Mark Schultheiss,这不仅关乎速度,还关乎可靠性。如果有人无知地调用nthParent(-2),你的函数会发生什么?你的例子坏了。
      • 或者直接返回(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
      • @Mark Schultheiss,再次强调可靠性。 My 函数返回选择中每个 元素的nthParent,your 函数返回parents 列表中的第n 个元素,这将是不正确的用于具有多个元素的选择。
      • true 关于-2,并且在您的示例中使用var p = n &gt;? (1 + n):1; 会在这种情况下返回第一个父级而不是“无” - 或者它在我的示例中打破循环。所以,如果你不想返回任何东西,它可能应该是:(function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n &gt; -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery));
      【解决方案9】:

      如果你有一个共同的父 div,你可以使用 parentsUntil() link

      例如:$('#element').parentsUntil('.commonClass')

      优点是你不需要记住这个元素和公共父级(由 commonclass 定义)之间有多少代。

      【讨论】:

        【解决方案10】:

        你也可以使用:

        $(this).ancestors().eq(n) 
        

        例如:$(this).ancestors().eq(2) -> this 的父级的父级。

        【讨论】:

          【解决方案11】:

          parents() 返回一个列表,这也有效

          $('#element').parents()[3];
          

          【讨论】:

            【解决方案12】:

            你可以这样使用:

            (function($) {
                $.fn.parentNth = function(n) {
                    var el = $(this);
                    for(var i = 0; i < n; i++)
                        el = el.parent();
            
                    return el;
                };
            })(jQuery);
            
            alert($("#foo").parentNth(2).attr("id"));
            

            http://jsfiddle.net/Xeon06/AsNUu/

            【讨论】:

            • 不是反对者,但这可能是这里最糟糕的解决方案(即效率低下)。
            【解决方案13】:

            使用 eq 似乎是抓取动态 DOM,而使用 .parent().parent() 似乎是抓取最初加载的 DOM(如果可能的话)。

            我在一个元素上同时使用它们,该元素在 onmouseover 上应用了它的类。 eq 显示类,而 .parent().parent() 不显示。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多