5

鉴于此 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/

4

5 回答 5

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')
    }
});

小提琴

于 2013-10-07T07:15:50.723 回答
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 是嵌套的,那么您将不得不修改第一行而不是调用

 $('.item').eq(0)

您应该使用嵌套级别修改 0 即

 $('.item').eq(1)//if it has one .item parent
于 2013-10-07T07:33:23.247 回答
0

使用 $(选择器)

$('.item:not(.item:first-child .item .item)').css( 'color', 'purple' );

小提琴:http: //jsfiddle.net/yTVPr/22/


使用 .each()

$(".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/


使用根元素和 parentsUntil()

如果您确实为嵌套的“级别”包含了一个类,则可以遍历 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>

小提琴:http: //jsfiddle.net/yTVPr/19/

于 2013-10-07T08:41:22.977 回答
0

如何选择第一个嵌套.item及其兄弟?

我在这里更新了小提琴:http: //jsfiddle.net/LWmy3/3/使用红色边框而不是红色文本来表明它没有选择“不要选择我”项目。

编辑:使用 each()

http://jsfiddle.net/LWmy3/5/

于 2013-10-07T07:00:27.853 回答
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);
}

然后将像这样使用此函数:

var baseItem = $(".item:first")
baseItem.flatFind('.item').css('color', 'red');
于 2014-09-16T16:57:34.207 回答