Как выбрать дочерние элементы, но только один уровень с 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

Обратите внимание, что сложная часть заключается в том, что мне нужно пропустить div2 при запуске с div1. Поэтому я не могу просто использовать $("#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")
[]

Ответы

Ответ 1

Найдите ближайших внуков:

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

Fiddle: 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");​​​​​​​​​​​​​​​​​

Fiddle: http://jsfiddle.net/jonathansampson/Dy6GJ/3/

Ответ 2

Общие (когда может быть гарантирован только класс):

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

Как описано (вероятно, быстрее, чем вообще, хотя и не проверено):

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

"Все .b, которые не являются потомками .b"