Принимая во внимание этот пример разметки (при условии случайного числа элементов от .outer
до .inner
:
<div class="outer">
<div>
<div>
<div class="inner"></div>
</div>
</div>
</div>
, я могу настроить jQuery для выбора внешнего и внутреннего div как:
$outer = $('.outer');
$inner = $outer.find('.inner')
Работает нормально.
Однако, допустим, я хочу разрешить неограниченное вложение этой логики, поэтому я могу иметь следующее:
<div class="outer"> div a
<div class="inner"> div b
<div class="outer"> div c
<div class="inner"> div d </div>
</div>
</div>
</div>
В такой ситуации, когдавыбрав div a via .outer
Я хочу сопоставить его только с div B. Другими словами, я хочу исключить предков вложенного .outer
предка.
Я хотел бы иметь соединения внешнего и внутреннего(s) содержится в пределах их уровня вложенности.
Я надеюсь, что .filter()
мог бы справиться с этим, но не могу придумать селектор, который бы работал универсально для неограниченных вложенных шаблонов. Это выполнимо с помощью фильтра? Или, может быть, даже шаблон прямого селектора?
ОБНОВЛЕНИЕ:
Я думаю, что-то вроде этого может работать, но не уверен, как можно (или если это разрешено) ссылаться на «это» в селекторе:
$outer = $('.outer');
$inner = $outer.not('this .outer').find('.inner')
ОБНОВЛЕНИЕ 2:
Я долженупомянул это изначально: .inner
всегда будет потомком .outer
, но не обязательно непосредственным ребенком.
ОБНОВЛЕНИЕ 3:
Вот несколько тестовых примеров HTML, которые можно использовать.В каждом случае я хотел бы иметь возможность выбрать .outer и соединить .inner, который он содержит между собой и вложенным внешним.Для ясности я добавил имена к каждому div (пары external-x с inner-x)
//sample 1
<div class="outer"> outer-a
<div>
<div class="inner"> inner-a
<div class="outer"> inner-b
<div class="inner"> inner-b </div>
</div>
</div>
</div>
<div>
<div class="inner"> inner-a </div>
</div>
</div>
//sample 2
<div class="outer"> outer-a
<div class="inner"> inner-a
<div class="outer"> inner-b
<div>
<div class="inner"> inner-b </div>
</div>
</div>
</div>
</div>
//sample 3
<div class="outer"> outer-a
<div class="inner"> inner-a
<div class="outer"> inner-b
<div class="inner"> inner-b
<div class="outer"> outer-c
<div class="inner"> inner-c</div>
</div>
</div>
</div>
</div>
</div>
//bonus sample (we're trying to avoid this)
<div class="outer"> outer-a
<div class="inner outer"> inner-a outer-b
<div class="inner"> inner-b </div>
</div>
</div>
UPDATE 4
Я думаю, что в конечном итоге пошел по тому же пути, что и gnarf.Я закончил с этим:
var $outer = $('.outer');
var $inner = $outer.find('.inner').filter(function(){
$(this).each(function(){
return $(this).closest('.outer') == $outer;
});
});
Я на правильном пути там?Это не работает, поэтому я предполагаю, что у меня все еще есть небольшая логическая ошибка.