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

2024-03-02

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

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


如果你想要单行,请尝试http://jsfiddle.net/4JNaL/ http://jsfiddle.net/4JNaL/

$('li ul:not(:has(li:not(.selected)))').parent().addClass('selected');

or

var theParent = $('li ul:not(:has(li:not(.selected)))').parent();

返回要操作的元素

对于任意深度的树:http://jsfiddle.net/GQbmU/4/ 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/ http://jsfiddle.net/GQbmU/6/

while ( $('li:not(.selected) > ul:not(:has(li:not(.selected)))').parent().addClass('selected').length > 0) {} ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果所有子节点都分配了类,则选择父节点 的相关文章

随机推荐