我正在寻找一种有效的方法来遍历无序列表,该列表包含多个级别,其中包含类 .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(使用前将#替换为@)