使用 jQuery 获取不是具有特定 CSS 类的容器的子元素的元素的后代

Posted

技术标签:

【中文标题】使用 jQuery 获取不是具有特定 CSS 类的容器的子元素的元素的后代【英文标题】:Use jQuery to get descendants of an element that are not children of a container with a certain CSS class 【发布时间】:2012-01-04 05:43:08 【问题描述】:

我有一种情况,我需要选择某个元素的所有后代,但 排除 那些是容器的子代,该容器等于我运行选择器的容器的 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('.element') 会得到所有的 DIV,甚至是第二个容器内的 DIV。这是我尽量避免的。

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

【问题讨论】:

你能指出我要选择哪些元素吗? 在这种情况下,级别 1 的 4 个 DIV 具有“元素”类 【参考方案1】:

我认为您要使用的是not 选择器。像这样..

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

或者,您可以使用children 选择器从一层深处获取孩子。这将排除嵌套的 div。

为了更明确一点,我认为在使用“find”之后,您会想要使用 not 选择器。像这样:

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

您可以将函数传递给 not,因此您可以让该函数查看每个匹配元素的父元素,以查看它是否嵌套在具有相同类的元素内。

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。

【讨论】:

很高兴知道!在我的特殊情况下, children() 更合适。但是非常感谢你让我注意到 not()。无论如何,children() 完成了这项工作。直到我想出一个要支持多个级别的案例。 我发现我遇到了 DIV 再次嵌套在容器中的情况,这就是我不得不转储 children() 的原因。使用 not() 似乎是个好主意,但问题是:使用什么选择器与 not() 匹配父容器(不是直接匹配子容器)? 感谢您的提示。我尝试应用它,但没有这样做。我发现如果我只是对所有后代容器应用一个额外的 CSS 类可能会更容易,这样我就可以轻松地排除它们。但是现在我似乎没有找到使用什么选择器来通过使用 .find() 选择所有 .container DIV 并排除所有属于具有特定 css 类的元素的子元素的元素。 - 你更快。让我尝试应用您的最新解决方案。 就是这样。一旦我应用了您的最终建议并在 not() 语句中的父类名称和子类名称之间添加了一个 >,它就起作用了。 .not($('.canHaveChildren > .element')) - 谢谢!你拯救了我的一天。 在 find 语法之后应用 .not($(".nested .element")) 有助于解决我在 find all 后过滤的需要:$(".container").find("* ").not($(".element"))【参考方案2】:

对于您的具体示例,这将起作用 -

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

这只会获得***元素 div。如果您的元素集合采用不同的结构,您可以将 body 替换为集合的容器 ID。

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

【讨论】:

我不能应用这个解决方案,因为即使上面描述的例子被简化了,实际情况有点复杂。不过谢谢。【参考方案3】:

你可以像这样使用 jquery 选择器:

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

【讨论】:

发件人:api.jquery.com/all-selector .... 注意:所有或通用选择器非常慢,除非单独使用。 让您知道... 【参考方案4】:

我发现以下内容比所选答案更简洁、更笼统。它适用于任意深度嵌套的树:

function getNonNestedElements(container, elementSelector, containerSelector) 
  return container.find(elementSelector).not(function(index) 
    var nearest = $(this).closest(containerSelector);
    return nearest[0] !== container[0];
  );

地点:

container 是根“容器”div 的 jQuery 对象 elementSelector 是元素的 jQuery 选择器,在本例中为 .element containerSelector 是容器的 jQuery 选择器,在本例中为 .container

所以这会找到初始容器下的所有元素,然后为每个元素检查其最近的容器是初始容器还是其他嵌套容器。如果它最近的容器是嵌套容器,它将把它扔掉,所以你只剩下不在另一个容器内的后代。

对于重复多元素嵌套表单字段等事情非常方便。

【讨论】:

以上是关于使用 jQuery 获取不是具有特定 CSS 类的容器的子元素的元素的后代的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 选择具有特定类的下一个表行?

jQuery 选择器:获取包含特定单词的第一个元素类的内容

CSS选择具有特定类的第一个元素

如何使用 jQuery 检索具有特定类的众多元素的 .length?

使用jQuery将具有特定类的每个div的名称保存到变量中

如何样式化具有特定子级的父 CSS 类 [重复]