鉴于此HTML:
<ul>
<li><a href="/artists/gil_elvgren/activity_stream">Activity Stream</a></li>
<li><a href="/artists/gil_elvgren/likes">Likes</a></li>
<li>Favorites</li>
<li><a href="/artists/gil_elvgren/follows">Follows</a></li>
<li><a href="/artists/gil_elvgren/sketchbook_comments">Whiteboard</a></li>
</ul>
我想将class="current"
注入到其中没有链接的单行项目中。
如何使用jQuery查找不包含子元素的元素?
答案 0 :(得分:8)
使用:has
和:not
选择器选择没有<li>
孩子的<a>
元素:
$("li:not(:has(a))").addClass("current");
- 编辑 -
虽然这可能是最短的解决方案,除了可读性之外,它绝对不是速度方面的最佳解决方案。
考虑到这一点,我建议您查看由answer提供的精彩@bazmegakapa。
由于这是你(或包括我在内的任何人)可能不止一次使用的东西,我使用这个插件/方法扩展了jQuery,以便DRY你的代码:
jQuery.fn.thatHasNo = function(element, method) {
if (typeof method === "undefined" || method === null) method = "children";
return this.not(function() {
return $(this)[method](element).length;
});
};
您可以致电:
$("li").thatHasNo("a").addClass("current");
默认情况下(如果未传递方法的第二个参数),此扩展将检查是否存在与提供的选择器匹配的任何直接后代(children)。但是,您可以提供任何tree-traversal parameter作为方法的第二个参数。因此,这可以写成以下任一项:
$("li").thatHasNo("a", "children").addClass("current");
//...
$("li").thatHasNo("a", "find").addClass("current");
//...
$("li").thatHasNo(".class", "siblings").addClass("lame");
我已更新jsFiddle以反映这一点。
答案 1 :(得分:1)
你应该使用.not()
方法(基本上是否定的.filter()
)和过滤函数。
$('li') /* select the elements you want to test */
.not(function () { /* run a filter function on them */
/* those that have a direct children link (use find() if you need
any kind of children) will return true thus excluded */
return $(this).children('a').length;
})
.addClass('current'); /* add our beloved class */
你也可以使用复杂的选择器,@Krule suggested,但我发现它不太可读,甚至jQuery manual on :not()警告它:
.not()方法最终会为您提供更多可读性 选择而不是将复杂的选择器或变量推送到:not() 选择器过滤器在大多数情况下,这是一个更好的选择。
此外,我也不建议使用:has()
:
因为:has()是一个jQuery扩展而不是CSS的一部分 规范,查询使用:has()无法利用 本机DOM querySelectorAll()提供的性能提升 方法。要在现代浏览器中获得更好的性能,请使 $(“your-pure-css-selector”)。而是(selector / DOMElement)。
答案 2 :(得分:0)
$("li").each(function(){
if($(this).children().length == 0){
//found current..
$(this).addClass("current");
}
});
答案 3 :(得分:-1)
我建议您只在<span>
内添加<li>
元素,以区分其中包含链接的元素。
<ul>
<li><a href="/artists/gil_elvgren/activity_stream">Activity Stream</a></li>
<li><a href="/artists/gil_elvgren/likes">Likes</a></li>
<li><span>Favorites</span></li>
<li><a href="/artists/gil_elvgren/follows">Follows</a></li>
<li><a href="/artists/gil_elvgren/sketchbook_comments">Whiteboard</a></li>
</ul>
CSS:
ul li a { /* Link CSS */ }
ul li span { /* Current CSS */ }