19

鉴于这种:

<div id="div1">
    <div id="div2">
        <div id="div200">
            <div id="div3" class="b">       
            </div>
            <div id="div300">
                <div id="div4" class="b">
                     <div id="div5"> 
                        <div id="div6" class="b">
                        </div>            
                     </div>
                </div>
            <div>
        <div>
    <div>
</div>

我需要一种方法来找到属于“b”类的元素的子元素(深),而不是嵌套在匹配元素中的元素。

测试用例:

这就是我需要的:

情况1:

$("#div1").some_jquery_syntax(".b")
Should return:
div3, div4

案例二:

$("#div5").some_jquery_syntax(".b")
Should return:
div6

请注意,困难的部分是我必须从 div1 开始时跳过 div2。所以我不能只使用$("#div1").find("> .b").

我的尝试:

我试过这个:

$("#div1").find(".b")
[<div id="div3" class="b"></div>, <div id="div4" class="b"></div>, <div id="div5" class="b"></div>]

不好:我不想要 div5,因为它嵌套在 div4 中。

我试过这个:

$("#div0").find(".b").not(".b .b")
[<div id="div3" class="b"></div>, <div id="div4" class="b"></div>]

从 div0 开始时可以,但从 div4 开始不起作用:

$("#div5").find(".b").not(".b .b")
[]
4

3 回答 3

17

查找直系孙子:

​$("#div1").children().children(".b");

小提琴:http: //jsfiddle.net/jonathansampson/Dy6GJ/

如果您不知道要走多远,但.b不希望所有内容都在 a 内.b,请在尊重父母限制的同时使用过滤器。您可以使用以下.parentsUntil方法:

var parent = "#div1";
$(".b", parent).filter(function(){
    return !$(this).parentsUntil(parent, ".b").length;
}).css("border", "1px solid red");​​​​​​​​​​​​​​​​​

小提琴:http: //jsfiddle.net/jonathansampson/Dy6GJ/3/

于 2012-06-05T17:35:32.513 回答
5

一般(当只能保证等级时):

$("#div1").find(".b:not(.b .b)")

如上所述(可能比一般更快,但未经测试):

$("#div1").find("div.b:not(div.b div.b)")

“所有 .b 不是 .b 的后代”

于 2012-10-08T21:12:08.757 回答
2

你离最快的解决方案不远了,问题是

$("#div5").find(".b").not(".b .b")

.not不是与您的初始选择器无关(例如:)#div5,并且由于在 DOM 树中有一个.b#div6级,它将被排除在外(父级是#div4

然后解决方案是让你的.not相对于你的选择器

这将正确选择#div6

$("#div4").find(".b").not("#div4 .b .b")

这将正确选择#div3#div4

$("#div1").find(".b").not("#div1 .b .b")

您可能还对这个递归迭代器函数感兴趣

它将以当前元素和深度作为参数调用回调函数,递归可以使用 asc 参数进行升序或降序,您还可以指定最大递归深度

在 desc 模式下,如果您的回调返回 false,则迭代立即停止

于 2019-03-16T12:13:53.557 回答