鉴于此HTML结构
<div class="item">
<div class="item">
select me
<div class="item">don't select me</div>
</div>
<span>
<div class="item">select me</div>
</span>
</div>
这个jQuery:
var firstItem = $('.item:first');
var selector = firstItem.find('.item');
selector.css('color', 'red');
我正在寻找一种方法来仅标记firstItem div中未嵌套的.item元素。这里棘手的部分是firstItem本身(或可以)已经嵌套在.item类中。
我尝试了什么?
firstItem.find('.item').not('.item .item')
这不起作用,因为我们开始的第一级已经是.item类。这可以嵌套x次,所以它可以是.item .item .item .item或者其他什么。并且起始元素没有ID,所以我也不能在选择器中使用它。
我认为解决方案应该类似于反向.closest(),它沿着DOM传播并且不会搜索已经找到的项目的内容。
在这里准备了一个jsFiddle:http://jsfiddle.net/LWmy3/2/
答案 0 :(得分:2)
试试这个
var firstItem = $('.item:first');
$(firstItem).find(".item").each(function () {
//console.log($(this).parent(".item")[0])
if ($(this).parent(".item")[0] === undefined) {
$(this).css('color', 'red')
} else if ($(this).parent(".item")[0] != $(firstItem)[0]) {
$(this).css('color', 'cyan')
} else {
$(this).css('color', 'red')
}
});
答案 1 :(得分:0)
如何选择第一个嵌套的.item
及其兄弟姐妹?
我在这里更新了小提琴:http://jsfiddle.net/LWmy3/3/使用红色边框而不是红色文字来表示它没有选择“不要选择我”项目。
编辑:使用每个()
答案 2 :(得分:0)
这也有效,
var firstItem = $('.item').eq(0);
var selector = firstItem.find('.item').each(function(){
var $parents = $(this).parents('.item');
if($parents.eq(0)[0]==firstItem[0]){
$(this).css('color', 'red');
}else{
$(this).css('color', 'blue');
}
});
http://jsfiddle.net/LWmy3/10/ 但是,如果firstItem嵌套了itselft,那么你将不得不修改第一行而不是调用
$('.item').eq(0)
你应该用嵌套级别修改0,即
$('.item').eq(1)//if it has one .item parent
答案 3 :(得分:0)
$('.item:not(.item:first-child .item .item)').css( 'color', 'purple' );
小提琴:http://jsfiddle.net/yTVPr/22/
$(".item:first-child").each(function( index, element ) {
if ( $(this).parents( '.item' ).length <= 1 )
$(this).css( 'color', 'red' );
else
$(this).css( 'color', 'black' );
});
添加了额外的DOM元素进行测试,虽然我认为大多数人提出了相同的想法。我认为如果没有至少一个ID或类来表示一个嵌套,这是相当困难的。
小提琴: http://jsfiddle.net/yTVPr/
如果您确实为嵌套的“级别”添加了一个类,则可以横切each()并找到与aganist parentsUntil()
匹配的长度,如下所示:
<div class="item toplevel">
<div class="item">
select me
<div class="item">don't select me</div>
</div>
<span>
<div class="item">select me</div>
</span>
</div>
<script>
/**
* Transverse Up the tree
* to find .toplevel, if length
* 0, then it's met the parent/target.
**/
$(".item").each(function( index, element ) {
if ( $(this).parentsUntil( '.toplevel', '.item' ).length === 0 )
$(this).css( 'color', 'blue' );
});
</script>
答案 4 :(得分:0)
您可以使用find()
选择所有匹配的元素,然后删除与选择器匹配的所有嵌套元素。为了便于使用,可以将其包装在jQuery扩展函数中:
$.fn.flatFind = function(selector) {
// Find everything matching the selector
var all = this.find(selector);
// Find nodes nested into one of the "direct" matches
var nested = all.find(selector);
// Return everything but the nested nodes
return all.not(nested);
}
此功能将be used like this:
var baseItem = $(".item:first")
baseItem.flatFind('.item').css('color', 'red');