Выберите самого глубокого ребенка в jQuery
Есть ли дешевый способ выбрать самого глубокого потомка элемента?
Пример:
<div id="SearchHere">
<div>
<div>
<div></div>
</div>
</div>
<div></div>
<div>
<div>
<div>
<div id="selectThis"></div>
</div>
</div>
</div>
<div>
<div></div>
</div>
</div>
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: Это, скорее всего, лучший подход, чем мой первоначальный ответ:
Пример: http://jsfiddle.net/patrick_dw/xN6d5/5/
var $target = $('#SearchHere').children(),
$next = $target;
while( $next.length ) {
$target = $next;
$next = $next.children();
}
alert( $target.attr('id') );
или это даже немного короче:
Пример: http://jsfiddle.net/patrick_dw/xN6d5/6/
var $target = $('#SearchHere').children();
while( $target.length ) {
$target = $target.children();
}
alert( $target.end().attr('id') ); // You need .end() to get to the last matched set
Оригинальный ответ:
Казалось бы, это работает:
Пример: http://jsfiddle.net/xN6d5/4/
var levels = 0;
var deepest;
$('#SearchHere').find('*').each(function() {
if( !this.firstChild || this.firstChild.nodeType !== 1 ) {
var levelsFromThis = $(this).parentsUntil('#SearchHere').length;
if(levelsFromThis > levels) {
levels = levelsFromThis;
deepest = this;
}
}
});
alert( deepest.id );
Если вы знаете, что самым глубоким будет определенный тег (или что-то еще), вы можете ускорить его, заменив .find('*')
на .find('div')
, например.
EDIT: Обновлено, чтобы проверять длину, если текущий элемент не имеет firstChild
, или если это так, что firstChild не является типом 1 node.
Ответ 2
Здесь небольшое улучшение ответа от @user113716, эта версия обрабатывает случай, когда нет детей и возвращает сам объект.
(function($) {
$.fn.deepestChild = function() {
if ($(this).children().length==0)
return $(this);
var $target = $(this).children(),
$next = $target;
while( $next.length ) {
$target = $next;
$next = $next.children();
}
return $target;
};
}(jQuery));
Ответ 3
Я не думаю, что вы можете сделать это напрямую, но вы можете попробовать
var s = "#SearchHere";
while($(s + " >div ").size() > 0)
s += " > div";
alert( $(s).attr('id') );
Ответ 4
Этот цепной однострочный инструмент работал у меня, но предполагает, что в иерархии ниже находится только один лист node.
jQuery("#searchBeginsHere")
.filter(function(i,e){ return jQuery(e).children().size() === 0; })
Ответ 5
Версия, чтобы получить самый глубокий для каждого листа.
http://jsfiddle.net/ncppk0zw/14/
var found = $('#SearchHere *');
for (var i = 0; i < found.length; i++) {
if (i > 1) {
if (found[i].parentNode !== found[i-1]) {
// Deepest. Next element is other leaf
console.log(found[i-1]);
continue;
}
if (i == found.length-1) {
// Deepest. Last element in DOM tree
console.log(found[i]);
}
}
}
Ответ 6
Это найдет самый глубокий элемент типа "param" на странице. Полезно, если вы ищете самое глубокое или что-то еще.
function deepest_child(param) {
var element_list = $(param)
var depth = 0
var deepest_element
element_list.each(
function (index) {
this_depth = $(this).parents().length
if (this_depth > depth) {
depth = this_depth
deepest_element= $(this)
}
})
return deepest_element
}