2011-01-18 1 views
2

У меня есть HTML-структура, которая содержит вложенные дивы с container класса:Выбор невложенных подузлов с JQuery

<div class="container" id="0"> 
    <div id="1"> 
    <div class="container" id="2"> 
     <div class="container" id="3"></div> 
    </div> 
    <div id="4"> 
     <div class="container" id="5"></div> 
    </div> 
    </div> 
</div> 

Это может включать в себя больше див и глубже/другом вложенности.

Начиная с некоторого момента в дереве я хотел бы найти все контейнеры в этом поддереве, которые не вложены в другие контейнеры. Например, из div #1 Я бы хотел найти divs #2 и #5, но не #3 (так как он вложен в контейнер #2 уже найден).

Что было бы лучшим способом достичь этого?

+0

Числовые идентификаторы недействительны. Тем не менее, есть ли причина, по которой вы бы просто не выбрали их по ID? Или на самом деле у них нет идентификаторов? – user113716

+0

@patrick: Я только установил идентификаторы там, чтобы было легче говорить о разных div, они на самом деле не существуют в реальном коде. – sth

+0

Я вижу. Будут ли те, которые вы хотите исключить, всегда быть * прямым * ребенком другого '.container'? Или может быть какой-то не '.container', разделяющий их? – user113716

ответ

0

Раствор, работа с произвольными исходными узлами:

function getContainers(base) { 
    return base.find('.container').not(base.find('.container .container')); 
} 

Пример: http://jsfiddle.net/tejp/GSRH2/2/

Преимущество i что это работает с произвольным стартовым узлом, который не нужно выбирать с помощью простого селектора JQuery, как это имеет место в некоторых других ответах. Также не требуется «вручную» ходить по всему дереву с children().

Этот подход также может быть легко распространен на аналогичные проблемы, например, на получение всех .item s не вложенных в .container.

2

Попробуйте использовать filter() метод JQuery в:

$items = $('#0').find('.container').filter(function(index) { 
    return !$(this).parents(':not(#0)').hasClass('container'); 
}); 

В принципе, он находит все элементы с классом .container ниже вашей верхней .container и фильтрует набор на основе того, имеет ли или нет прямых родительского класса .container.

Смотрите здесь для рабочего примера: http://jsfiddle.net/TzL8Z/1

+0

, хотя это не работает, если вложенность не равна 1 уровню, например. http://jsfiddle.net/r8nED/ все, что я изменил, я сделал id = 3 1 уровень ниже в разметке. OP сказал, что он не хочет выбирать id = 3, но ваш алгоритм его выбирает - вам нужно использовать 'parent()' not 'parent()', который должен ускорить мое решение – davin

+0

@ davin: Спасибо за головы, хотя ваше решение не совсем корректно.Вам нужно использовать 'parents (': not (# 0)')' или иначе он не возвращает set, потому что внешний контейнер имеет класс 'container'. Я обновил свой ответ. – treeface

+0

Я не вижу, где мое решение не возвращает значение, когда ожидаемый результат не пуст. Теперь, когда вы используете 'parent()' ваше решение не решает исходную проблему, потому что вы слишком долго смотрите вверх по дереву: http: // jsfiddle.net/TzL8Z/3/ – davin