我只需要从树中获取第一个匹配的元素(如果发现元素不需要更深入)。问题是这个元素可以包装成嵌套的div,所以我不能使用>
选择器
我的代码是这样的:
<div id="root">
<div class="sub">I need this element</div>
<div>
<div class="sub">I need this element</div>
</div>
<div class="sub">
<div class="sub">I don't need this element</div>
</div>
</div>
无法找到解决方案:(
答案 0 :(得分:5)
如果您无法使用子选择器,请尝试
$('.sub:not(.sub .sub)')
这仅选择那些不是其他.sub
元素后代的.sub
个元素。
可替换地:
$('#root .sub').filter(function() {
return $(this).parentsUntil('#root', '.sub').length === 0;
});
如果#root
位于.sub
内,也适用。
编辑:或者查看@ RightSaidFred对此案例的评论。
答案 1 :(得分:4)
您可以使用:
$('.sub').parent().not('.sub').children().css('color', 'green');
这是一个冗长的版本:
$('.sub:not(.sub .sub)').css('color', 'green');
修改:jsfiddle
答案 2 :(得分:1)
var level = $('#root'),
subs;
do {
level = level.children();
subs = level.filter('.sub');
} while( els.length && !subs.length )
subs
变量将保存结果。
这是一种有效的方法,如果您的#root
碰巧有.sub
祖先,这种做法会有效。
您可以轻松地将其变为可重复使用的功能。
function firstLevelOf( root, selector ) {
var level = $(root),
result;
do {
level = level.children();
result = level.filter(selector);
} while( els.length && !result.length )
return result;
}
像这样使用:
var subs = firstLevelOf( '#root', '.sub' );
答案 3 :(得分:1)
你需要在第一个div之上的元素或类,然后指定{parent-selector}&gt;
$('#root > div.sub').click(function(){
// your code here
});