在jQuery中select最深的孩子

有没有一个吱吱的方法来select一个元素的最深的孩子?

例:

<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> 

编辑:这可能是比我原来的答案更好的方法:

例如: 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('div')代替.find('*')来加快速度。

编辑:更新为只检查长度,如果当前元素没有firstChild或如果它确实,firstChild不是types1节点。

这里有一个来自@ 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)); 

我不认为你可以直接做,但你可以尝试

 var s = "#SearchHere"; while($(s + " >div ").size() > 0) s += " > div"; alert( $(s).attr('id') ); 

这个可链接的单线程为我工作,但它假定在下面的层次结构中只有一个叶节点。

 jQuery("#searchBeginsHere") .filter(function(i,e){ return jQuery(e).children().size() === 0; })