如何选择第一个“最浅”的输入?
我当前的选择将是标记为“已选择”的div 我不知道会有多少级别。
<div class="selected"> <!-- already have this -->
<div class="unknown-number-of-wrapper-panels">
...
<div class="collection">
<div class="child">
<input type="text" value="2" /> <!-- don't want this -->
</div>
</div>
<input type="text" value="2" /> <!-- need this -->
<input type="text" value="2" />
...
</div>
</div>
似乎find().first()
给了我最深的一个。
为了清晰而编辑。我需要根据它较浅而不是基于其他独特属性的事实来找到它。
这可能与closest()
相反?
答案 0 :(得分:7)
如果我理解你的问题,你需要递归检查子节点中是否有该类的元素。
function findShallowest( root, sel ) {
var children = root.children();
if( children.length ) {
var matching = children.filter( sel );
if( matching.length ) {
return matching.first();
} else {
return findShallowest( children, sel );
}
} else {
return null;
}
}
var selected = $('.selected');
findShallowest( selected, ':text' );
示例: http://jsfiddle.net/Qf2GM/
编辑:忘记了一个返回语句,并为初始.selected
设置了ID选择器而不是类选择器。
或者将它变成你自己的自定义插件:
示例: http://jsfiddle.net/qX94u/
(function($) {
$.fn.findShallowest = function( sel) {
return findShallowest( this, sel );
};
function findShallowest(root, sel) {
var children = root.children();
if (children.length) {
var matching = children.filter(sel);
if (matching.length) {
return matching.first();
} else {
return findShallowest(children, sel);
}
} else {
return $();
}
}
})(jQuery);
var result = $('.selected').findShallowest( ':text' );
alert( result.val() );
答案 1 :(得分:3)
你是在广度优先搜索而不是深度优先搜索(jQuery的find()使用)。快速谷歌发现:http://plugins.jquery.com/project/closestChild
这可以这样使用:
$(...).closestChild('input')
答案 2 :(得分:3)
稍微高尔夫这个“插件” - 使用@user113716's technique,只是缩小了代码大小。
$.fn.findShallowest = function( selector ) {
var children = this.children(),
matching = children.filter( selector );
// return an empty set if there are no more children
if ( !children.length ) {
return children;
}
// if anything matches, return the first.
if ( matching.length ) {
return matching.first();
}
// check grand-children
return children.findShallowest( selector );
};
试试jsFiddle
答案 3 :(得分:1)
这是另一种方法。这个想法是你得到的祖先数量最少的匹配元素:
(function($) {
$.fn.nearest = function(selector) {
var $result = $();
this.each(function() {
var min = null,
mins = {};
$(this).find(selector).each(function() {
var n_parents = $(this).parents().length,
if(!mins[n_parents]) {
mins[n_parents] = this;
min = (min === null || n_parents < min) ? n_parents : min;
}
});
$result = $result.add(mins[min]);
});
return $result;
};
}(jQuery));
用法:
$('selected').nearest('input');
findShallowest
,as @patrick has it,可能是更好的方法名称;)
答案 4 :(得分:0)
如果您不知道底层元素的类名,您可以随时使用
之类的内容$('.unknown-number-of-wrapper-panels').children().last();
答案 5 :(得分:0)
考虑到你的标记,以下工作会不会发生?
$('.selected div > input:first')