Поиск всех потомков «X-поколения» с помощью jQuery

Раскрыто ( вид )

Ну, я думаю, что я раскрыл его ( запрещающие пограничные случаи ), используя следующее:

function findByDepth(parent, child, depth){
    var children = $();
    $(child, $(parent)).each(function(){
        if($(this).parentsUntil(parent, child).length == (depth - 1)){
            children = $(children).add($(this));
        }
    });
    return children;
}

// this would successfully return the 3.X elements of an HTML snippet structured
// as my XML example, where  = #parent, etc.
var threeDeep = findByDepth('#parent', '.child', 3);

Однако кто-то должен получить принятый ответ здесь, и я не собираюсь отвечать на него сам и скрыться с вашим хорошо заработанным репом. ( до того, как я уйду, и $ .extend () в ) Я, вероятно, отмечу ваш ответ правильно, в противном случае возвращаясь к тому, кто был первым на моем первоначальном вопросе.

Между прочим, проверьте его в скрипку: http://jsfiddle.net/5PDaA /

Подобновление

Рассмотрение снова ответа @CAFxX, я понял, что его подход, вероятно, быстрее, используя в своих интересах querySelectorAll в браузерах, которые могут. В любом случае, я пересмотрел его подход к следующему, но это все еще дает мне guff:

$.fn.extend({
    'findAtDepth': function(selector, depth){
        var depth = parseInt(depth) || 1;
        var query = selector;
        for(var i = 1; i < depth; i++){
            query += (' ' + selector);
        }
        return $(query, $(this)).not(query + ' ' + selector);
    }
});

Это работает прекрасно в первый раз, однако по мере изменения контекста к элементу, обнаруженному в селекторе , он по какой-то причине не удается.


Обновите

Хорошо, я был глупо неясен и не осведомлен о спецификациях того, что я делаю. Поскольку я просмотрел свою реализацию, я буду обновлять здесь; Я отмечу самый ранний ответ, который соответствует моим первоначальным требованиям, учитывая, что люди считают меня дураком для обновления так безвозмездно ( я бы не стал винить вас ), однако мое бонусное упоминание ниже по сути является требованием. Я бы разместил еще один вопрос, но он, скорее всего, будет закрыт от дублирования. Тем не менее, + 1 для вашего терпения:

Спецификация глубины данного нижестоящего элемента необходима ( учитывая, что он заключен в функцию или иным образом ), таким образом изолируя нижестоящий элемент и одинаково вложенные ( не обязательно родные братья и сестры ) соответствующие элементы.

Например ( XML для краткости ):




                         
                         
                         
                 
                        
                         
                 
                        
                        
                         
                 
                        
                        

При указанной глубине 2 выбираются все элементы 2 .X . Заданы 4 все 4 .X и т. д.


Исходный вопрос

Есть ли способ выбрать только «первое поколение» потомков, соответствующих селектору? Например:

Примечание : Ниже приведен только пример. Элементы .child вложены в родительский элемент на произвольном уровне.

Бонус : Как показывает предложенный мной ниже синтаксис, ответ, который предоставляет способ указать глубину, до которой должен проходить выбор, будет невероятным .

// HTML

И:

// jQuery
$('#parent').find('.child:generation(1)'); // something in that vein

При попытке выбора из контекста # parent jQuery : first здесь не работает, поскольку он попадает только в первый сопоставленный .child .

5
задан Dan Lugg 17 September 2011 в 16:03
поделиться