如果您想选择没有任何孩子的节点,您可能会考虑使用:empty
。同时:empty
的行为非常烦人,因为任何空格都会使该规则不适用。 :blank
选择器作为救世主来到这里,但还没有浏览器实现它。
你知道选择里面没有其他元素的元素的技巧吗?
只是为了激发你的想象力:像.parent:not(:scope > *)
答案 0 :(得分:2)
选择器与文本节点不匹配,因此无法使用选择器模拟:blank
或:empty
。
从字面上看,.parent:not(:scope > *)
表示不是.parent
元素的子元素的任何:scope
元素,无论该范围根可能是什么。如果选择器没有作用域,那么它等同于.parent:not(:root > *)
,或者如果它出现在作用域样式表中,通常它意味着任何这样的元素不是代表这个作用域样式表的style
元素的兄弟。
我怀疑你的意思是.parent:not(:has(> *))
,它会匹配没有元素子元素的.parent
元素,但它没有考虑到它们的文本内容,同样的原因我也是提及。
好消息是,虽然你仍然需要等待供应商来实现这个新功能,而不是在单独的:blank
伪中实现它们,他们正在考虑修改{{1}的功能相反,只要它不会破坏太多的网站。请参阅this answer。
答案 1 :(得分:0)
正如BoltClock所说,目前只有css无法实现这一目标 - 虽然it was given up from the CSS3 specification可以使用:contains()
选择器。
我知道这不是你想要的,但这里有一个我有时使用的jQuery解决方案:
(function($){
$.isBlank = function(html, obj){
return $.trim(html) === "" || obj.length == 0;
};
$('li').each(function() {
if($.isBlank(
$(this).html(),
$(this).contents().filter(function() {
return (this.nodeType !== Node.COMMENT_NODE);
})
)) {
$(this).addClass('empty');
}
});
})(jQuery);
请参阅jsfiddle demo。它定位任何只有空格或注释的节点,但忽略带有子元素的元素。可能并不完美,但到目前为止它对我来说还算合适。
答案 2 :(得分:0)
我已变得更加通用,并接受带注释的空格。
$('*').contents().each(function() {
if(this.nodeType === Node.COMMENT_NODE) {
$(this).remove();
}
});
(function($){
$.isBlank = function(html, obj){
return $.trim(html) === "" || obj.length == 0;
};
$('*').each(function() {
if($.isBlank(
$(this).html(),
$(this).contents().filter(function() {
return (this.nodeType !== Node.COMMENT_NODE);
})
)) {
$(this).addClass('blank');
}
});
})(jQuery);