3

我正在寻找一种有效的方法来遍历包含多个级别的无序列表,其中包含.selected 类。如果一个组中的所有 UL LI 都有 class .selected,我需要添加 class .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 将是唯一添加了 .selected 类的父 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");
});

我不太确定我是否做得正确。它不工作。

4

4 回答 4

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

演示

于 2013-07-10T19:40:06.897 回答
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) {} ;
于 2013-07-10T19:50:28.017 回答
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");
        }
    });
});
于 2013-07-10T19:50:39.300 回答
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');
});
于 2013-07-10T20:16:28.450 回答