2015-09-07 90 views
0

.container类HTML标签形成我的情况是这样一个逻辑层次:CSS选择基于逻辑层次

<div class="container" data-id="1"> 
    Level 1 #1 
    <div>abc</div> 
    <div class="container" data-id="1"> 
     Level 2 #1 
     <div>other div container 
      <div class="container" data-id="1"> 
       Level 3 #1 
      </div> 
      <div class="container" data-id="2"> 
       Level 3 #2 
      </div> 
     </div> 
    </div> 
    <div>other div container 
     <div>other div container 
      <div class="container" data-id="2"> 
       Level 2 #2 
      </div> 
     </div> 
    </div> 
</div> 
<div class="container" data-id="2"> 
    Level 1 #2 
</div> 

现在我想基于该层次结构的路径元素来选择层次结构中的一个元素使用jQuery这样的:

$('.container[data-id="1"] .container[data-id="2"]').css("color", "red"); 

因此,我想有Level 2 #2是红色的,而不是Level 3 #2

我试图使用像这个jsFiddle :not()选择器,但它没有工作。

http://jsfiddle.net/zwg8cbg3/

是否与一个jQuery CSS选择器的任何解决方案?

+0

如果没有简单的解决方案就像使用一行CSS选择器一样,我可以遍历'$('。container [data-id =“1”] .container [data-id =“2”]' )',并使用具有与层次结构级别相对应的父级'.container'元素的数量(减1,因为当前元素不会是父级)。在本例中,它将是'.container [data-id =“2”]'的一个父'.container'元素。 – Sandro

回答

0

使用直接兄弟选择:

$('.container[data-id="1"] > div > .container[data-id="2"]').css("color", "red"); 

片段

$('.container[data-id="1"] > div > .container[data-id="2"]').css("color", "red");
div { 
 
    margin-left: 20px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<div class="container" data-id="1"> 
 
    Level 1 #1 
 
    <div>abc</div> 
 
    <div class="container" data-id="1"> 
 
    Level 2 #1 
 
    <div>other div container 
 
     <div class="container" data-id="1"> 
 
     Level 3 #1 
 
     </div> 
 
     <div class="container" data-id="2"> 
 
     Level 3 #2 
 
     </div> 
 
    </div> 
 
    </div> 
 
    <div>other div container 
 
    <div>other div container 
 
     <div class="container" data-id="2"> 
 
     Level 2 #2 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 
<div class="container" data-id="2"> 
 
    Level 1 #2 
 
</div>

+0

它仍然不会选择“2级#2”吗? – Sandro

0

由于没有答案了它的实现这样的:

var cssSelector = ""; 
var ids = this.scriptStack.split("_"); 
$(ids).each(function(){ 
    cssSelector+=".container[data-id='"+this+"'] "; 
}); 
$('...').find(cssSelector).each(function(){ 
    if($(this).parents('.container').size() == ids.length-1) { 
     // ... 
    } 
}); 

但是,当然,先选择很多元素然后再寻找合适的元素并不好。