1

我是学习jQuery的初学者,问题是:

使用“not”内置函数,将所有不包含 UL 元素的 LI 元素的“text-decoration”CSS 属性设置为“underline”。

我尝试了一些不同的选择器,包括:

$(li:not(li > ul)).css('text-decoration','underline');
$(li:not(li ul)).css('text-decoration','underline');

谁能帮我吗?谢谢。

4

3 回答 3

3

尝试使用以下not()功能:

$('#myDemo > li').not(':has(ul)').css('text-decoration','underline');

最上面#myDemoID在哪里ul哪里。

小提琴

于 2013-05-03T16:29:57.560 回答
1

上面给出的答案永远不会奏效。看看小提琴就知道为什么,也有你的答案


解释

这是一个棘手的事情。解决方案可能看起来很简单,但可能行不通。任何通过检查是否没有 a
来返回的尝试都是徒劳的。 <li><ul>

这是因为那些<li>拥有 a 的人<ul>将(可能)<li>在 that 内拥有 s <ul>。所以即使你没有匹配那些<li>s,你也成功匹配了他们的孙子——最里面<li>的s
因此,最后,您已经匹配<li>了 DOM 中的 所有内容

为了更好地理解它,请查看以下JS Fiddle,包括答案


答案- 从小提琴

我觉得您将不得不使用额外的过滤器(欢迎提出建议)。IMO 这只能通过类或 id 对 parent-most 的引用来完成<ul>,然后过滤结果:

$('li').not(':has(ul)').css('text-decoration','underline');
// Matches all the LIs, and therefore not useful

$('li').filter(function() {
    return $('ul', this).length == 0;
}).css('color', 'blue');
// Nice try, but still Matches all the LIs


// This works, but need a reference to main parent, using a class, id etc.
$('li').not(':has(ul)').filter(function() {
    return $(this).parent().hasClass('the-parent');
}).css('color', 'red');
于 2013-05-03T18:47:23.180 回答
0

我不确定您是否可以仅使用选择器来执行此操作。

这应该有效:

$('li').each(function() {
    if($(this).children('ul').length == 0) {
        $(this).css('text-decoration','underline');
    }
});
于 2013-05-03T16:32:34.433 回答