Ну, я думаю, что я раскрыл его ( запрещающие пограничные случаи ), используя следующее:
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
.