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