我想选择给定类型的第一级子元素,但不包括嵌套在另一个符合条件的元素中的元素。例如,在:
<div id='top'>
<div id="s1" class="special">
<div id="s2" class="special"></div>
</div>
<div>
<div id="s3" class="special"></div>
</div>
</div>
我想用类似于$('#top').find('.special:not_nested')的方法找到#s1和#s3,但不包括#s2。在jQuery或XPATH中是否有可能实现?
我考虑使用jQuery自定义过滤器,如expr[':'].not_nested,但无法考虑顶级父元素($('#top') 在此情况下),因为在#top的父级链中可能会有其他.special类。
[编辑] 我应该提到,现在我正在使用$.fn.children()进行递归调用,我认为这不是很有效率。
[编辑2] 测试通过的代码:
var node = $('#top'),
result = (node.find('.special').filter(function(){
return !($(this).parent().closest(".special", node).length);
}));
然而,如果“#top”本身具有“.special”类,则此方法无效。所以也许应该这样处理:
var node = $('#top'),
result= node.find('.special').filter(function(){
var parent = $(this).parent().closest(".special", node);
return !parent.length || parent.is(node);
});
.closest()
中的选择器匹配,.closest()
将返回当前元素。 - Kevin B