如何使用jQuery选择子元素但只有一个级别

时间:2012-06-05 17:34:15

标签: jquery

鉴于此:

<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

案例2:

$("#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")
[]

3 个答案:

答案 0 :(得分:15)

找到直接的大孩子:

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

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

如果您不知道要走多远,但希望所有.b都不在.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/

答案 1 :(得分:5)

一般(只保证课程时):

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

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

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

&#34;所有.b都不是.b&#34;

的后代

答案 2 :(得分:1)

您距离最快的解决方案

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

.not 是否与您的初始选择器无关(例如: #div5 ),并且由于DOM树中有 .b #div6 父级,它将被排除(父级为 #div4 < / em>)

然后的解决方案是使您的 .not 相对于这样的选择器

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

这将正确选择 #div6

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

这将正确选择 #div3 #div4

您可能还对this recursive iterator function

感兴趣

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

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