13

这似乎应该相当容易 - 但我找不到合适的选择器

根据文档(http://api.jquery.com/hidden-selector/http://api.jquery.com/visible-selector/)...

元素可以被认为是隐藏的,原因如下:

祖先元素是隐藏的,因此该元素不会显示在页面上。

我要检测的是“这个元素是可见的,但包含在隐藏的父元素中”。即,如果我使父元素可见,则该元素也将可见。

4

3 回答 3

27

如果这是您经常使用的东西,请制作您自己的选择器 :) 下面是一个示例:

jQuery.expr[':'].hiddenByParent = function(a) { 
   return jQuery(a).is(':hidden') && jQuery(a).css('display') != 'none'; 
};

您可以像这样使用它,测试标记:

<div style="display: none" id="parent">
  <div>
      <div id="child">Test</div>
  </div>
</div>
​

使用示例:

$("div:hiddenByParent").length;​​​​​​​​​​​​​​​​​​ // "2" (plain div + child match)
$("#child").is(":hiddenByParent"); // true

或者,您可以使用如下.filter()函数:

$('selector').filter(function() {
  return $(this).is(':hidden') && $(this).css('display') != 'none';
}
于 2010-03-31T15:59:11.823 回答
5

jQuery 现在已经内置了这一切

$("#child").closest(':hidden').length == 0
于 2012-03-02T17:07:41.087 回答
1

如果它是您正在寻找的特定元素,那么您可以检查它的显示属性

$('#element').css('display') != 'none';

如果它不是特定元素,那么您可以使用 :hidden 找到隐藏的父节点,然后使用自定义函数查找所需类型的节点。例如

$('parent-selector:hidden').find('node-selector').each(function(){
  if($(this).css('display') != 'none') {
    // do what you wanted
  }
});

如果您想要一个干净的选择器,那么我认为您将不走运,因为我认为您想要的不是 CSS 规范的一部分,因此不会在 jQuery 中作为选择器存在。

于 2010-03-31T14:51:46.853 回答