2011-11-22 77 views
17

我有一种情况需要选择某个元素的所有后代,但不包括那些属于某个元素的子元素的子元素容器,它等于容器的CSS类,我运行我的选择器。使用jQuery获取元素的后代不是具有某个CSS类的容器的子元素

很复杂的描述。

<div class="container"> 
    <div class="element"></div> 
    <div class="element"></div> 
    <div class="element"></div> 
    <div class="element"> 
     <div class="container"> 
      <div class="element"></div> 
      <div class="element"></div> 
      <div class="element"></div> 
     </div> 
    </div> 

在最外层的DIV运行一个jQuery .find(“元素”)会让我所有的DIV,甚至第二容器内的人。这是我尽量避免的。

这种情况下是否有快速简单的jQuery选择器解决方案?

+0

你能指出我你要选择哪些元素? – BoltClock

+0

在这种情况下,级别为1的4个DIV与类“元素” – SquareCat

回答

25

我想你想使用的是not选择器。这样的..

$(".container").not(".container .container") 

或者,你可以使用children选择,从深一个层次得到了孩子们。这将包括嵌套的div。

为了更清楚一点,我想你会想在使用'find'后使用非选择器。就像这样:

$(".container").find(".element").not($(".container .container .element")) 

您可以通过一个功能没有,所以你可以有功能看看每个元素匹配的父母,看它是否被嵌套在同一类的元素中。

http://jsfiddle.net/QXfs2/6/

removeIfNested = function(index) { 
    // this is the corrent DOM element 
    var $this = $(this), 
     return_value = false; 

    $.each($this.attr('class').split(/\s+/), function(index) { 
     if ($this.parents("." + this).length > 0) { 
      return_value = default_value || true; 
     } 
    }); 

    return return_value; 
} 


$(".container").find(".element").not(removeIfNested); 

如果你可以添加一个类嵌套的容器,这将是理想的,那么它只是:

$(".container").find(".element").not($(".nested .element")) 

假设你添加了类“嵌套”,给你的内部容器div。

+0

这非常好知道!在我的特殊情况下,儿童()虽然更合适。但是非常感谢把我的注意力集中在not()上。无论如何,孩子们()完成了这项工作。直到我想出一个支持多个级别的情况。 – SquareCat

+0

我发现我有DIVs再次嵌套在容器中的情况,这就是为什么我必须转储子项()。使用not()似乎是一个好主意,但问题是:使用not()来匹配父容器(而不是直接)的选择器是什么? – SquareCat

+0

谢谢你的提示。我尝试过应用它,但没有成功。我发现如果我只是将一个额外的CSS类应用于所有后代容器可能会更容易,这样我就可以轻松地将它们排除在外。但是现在我似乎没有找到使用.find()来选择所有.container DIV的选择器,并排除了所有具有特定css类的元素的子元素。 - 你更快。让我尝试应用您的最新解决方案。 – SquareCat

2

针对您的特殊例子,这会工作 -

$("body > div.container > .element") 

这只会得到最高级别的元素的div。如果您的元素集合处于不同的结构中,您可以使用集合的容器标识代替body

演示 - http://jsfiddle.net/QAP37/

+0

即使上述例子被简化了,我也不能应用这个解决方案,但实际情况有点复杂。但是,谢谢。 – SquareCat

0

您可以使用jQuery选择这样的:

find('*:not(.container .container *)') 
+1

来自:https://api.jquery.com/all-selector/ .... **小心:全部或通用选择器极其缓慢,除非它本身被使用。 ... – Marcky

相关问题