如果所有子节点都已分配类,则选择父节点

时间:2013-07-10 19:35:39

标签: jquery

我正在寻找一种有效的方法来遍历一个无序列表,其中包含多个包含类.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");
});

我不太确定我是否正确地做到了。它不起作用。

4 个答案:

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