我正在寻找一种有效的方法来遍历一个无序列表,其中包含多个包含类.selected的级别。如果组中的所有UL LI都具有类.selected,我需要添加类。选择子UL的父LI。
<ul>
<li>one <-- this li adds class .selected if ALL its children have .selected
<ul>
<li class="selected">red</li>
<li class="selected">green</li>
<li class="selected">blue</li>
</ul>
</li>
<li>two
<ul>
<li class="selected">red</li>
<li>green</li>
<li class="selected">blue</li>
</ul>
</li>
<li>three</li>
</ul>
如果任何给定UL中的所有子节点都具有类.selected将类.selected添加到父LI,那么在这种情况下,包含文本“one”的LI将是唯一拥有该类的父LI。加入。
我需要在页面加载时发生这种情况。我已经尝试了一些方法,但这个方法最接近,但我不太确定它是否最有效:
$("ul li").filter(function () {
var lis_total = $(this).siblings().length + 1;
var lis_selected = $(".selected", this).siblings().length + 1;
if(lis_total == lis_selected)
return $(this).parent("li").addClass("selected");
});
我不太确定我是否正确地做到了。它不起作用。
答案 0 :(得分:3)
这样的东西?
$("ul li").filter(function () {
var all = $(this).find('> ul > li'); //get all immediate ul and its immediate li's
var selected = $(this).find('> ul > li.selected'); //get all immediate ul and its immediate li's with class selected
return all.length && all.length == selected.length; //return if there are li's and all are selected
}).addClass('selected'); //add class
<强> Demo 强>
答案 1 :(得分:3)
如果您想要单行,请尝试http://jsfiddle.net/4JNaL/
$('li ul:not(:has(li:not(.selected)))').parent().addClass('selected');
或
var theParent = $('li ul:not(:has(li:not(.selected)))').parent();
返回操作元素
对于任意深度的树:http://jsfiddle.net/GQbmU/4/
do {
$results = $('li:not(.selected) > ul:not(:has(li:not(.selected)))');
$results.parent().addClass('selected');
} while ( $results.length > 0);
或者,因为这个答案的主题是单行:http://jsfiddle.net/GQbmU/6/
while ( $('li:not(.selected) > ul:not(:has(li:not(.selected)))').parent().addClass('selected').length > 0) {} ;
答案 2 :(得分:1)
$(function () {
$("ul").filter(function () {
var lis_total = $(this).children("li").length + 1;
var lis_selected = $(this).children("li.selected").length + 1;
if (lis_total == lis_selected) {
$(this).parent("li").addClass("selected");
}
});
});
答案 3 :(得分:1)
http://jsbin.com/ecixez/2/edit
$('li>ul:has(.selected)').each(function(){
if($('.selected', this).length === $('li',this).length) // if 3 == 3 :)
$(this).parent().addClass('selected');
});