【问题标题】:Selecting the parent element that is hiding its children选择隐藏其子元素的父元素
【发布时间】:2013-01-24 19:48:13
【问题描述】:

我觉得以前可以问过这个问题,但我似乎找不到,所以我会问自己。

我想选择作为其子项被隐藏的“原因”的父元素。例如,一组元素本质上是“隐藏的”,但不是因为它们有display:none,而是因为沿途的某些父元素有display:none

如果我只有一个子元素并且我知道它是 hidden,那么我如何轻松找到导致它成为 hidden 的父元素。

我意识到一种解决方案就是递归地遍历父母,例如...

function findHiddenParent(el){
  var $el = $(el);
  if($el.css('display') == 'none'){
    return $el;
  }
  return findHiddenParent($el.parent());
}

注意我没有测试上面的代码,它只是为了概念化一个解决方案

但是有没有更简单的方法,也许是通过一些选择器魔法

【问题讨论】:

  • 您可以使用 .parents() 然后将其过滤到隐藏的最后一个元素。

标签: javascript jquery dom jquery-selectors


【解决方案1】:

您可以使用.parents(),然后将其过滤到最后一个隐藏的元素。

$(child).parents(":hidden").last().show();

它将选择具有display: none的层次结构中最高的父元素

演示:http://jsfiddle.net/X9W2v/

注意,:hidden 也会选择宽度/高度为 0 的元素。

【讨论】:

  • 一个元素被认为是:hidden,如果它的父元素是隐藏的。或者如果它的高度和宽度设置为 0。
  • 是的,.parents() 将全部选中,然后过滤到最后一个应该是具有 display: none 的那个。
  • 不幸的是,:hidden 返回的元素没有 display:none。如果祖先元素被隐藏,则元素被视为 :hidden,因此该元素不会显示在页面上。
  • 这绝对是我正在寻找的解决方案类型,对于我的特定情况,这将起作用,但我必须说,在某些情况下它不起作用,例如如果多个父母有display:none
  • 是的,如果有多个父母,它仍然只会选择最后一个。在那种情况下,约瑟夫的回答会更好。
【解决方案2】:

这与你所拥有的类似:

function findHiddenParents ( el ) {
    return $(el).parents().filter(function () {
        return $(this).css('display') == 'none';
    });
}

这将返回隐藏的所有个祖先。如果你只想要最近或最远的,你可以分别用.first().last()返回。


如果您对隐藏了哪些元素并不真正感兴趣,而只想将它们全部显示出来,那么没有比这更简单的了:

$(el).parents().show()

【讨论】:

  • 对于自定义和动态解决方案,这可能是最好的。我知道 filter 但我不知道它的内部运作细节,所以我无法评论它的效率。
【解决方案3】:

这就是我在纯 JavaScript 中的做法。不知何故,我觉得它比涉及循环或回调的 jQuery 解决方案更干净(Kevin B 的单行代码看起来很棒!)。缺点是,它更长,而且它不检查计算样式:

<div id="container">
    <div id="a" style="display: none;">A
        <div id="b">B
            <div id="c">C</div>
        </div>
    </div>
</div>
var currentNode = document.getElementById('c');
while(currentNode.parentNode && currentNode.style.display !== 'none') {
    currentNode = currentNode.parentNode;
}
alert(currentNode.id);

http://jsfiddle.net/nc4h2/

【讨论】:

  • +1 同意,当您只需要 parentNode 和 style.display(可能还有一点 offsetHeight)时,jQuery 并没有带来太多价值。
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
相关资源
最近更新 更多