我正在构建产品的嵌套下拉导航,我想自动隐藏任何空的类别。
不幸的是服务器端语言不允许这样做的有效方式,所以我想我可以直接输出每个类别的产品数量,然后使用jQuery删除任何空节点。
我想仅定位li
中的nav#top_nav
:
<nav id="top_nav">
<nav class="nav1">
<ul>
<li data-num-products="0">
<a href="...">AAA</a>
<ul>
<li data-num-products="3"><a href="...">BBB</a></li>
<li data-num-products="0"><a href="...">CCC</a></li>
</ul>
</li>
<li data-num-products="7"><a href="">DDD</a></li>
</ul>
<nav>
</nav>
给定1级嵌套ul
,我想删除任何li
的...
其中没有嵌套ul
和
有data-num-products == 0
。
因此,在上面的示例中,AAA
被保留,因为它有ul
个孩子,但CCC
被删除了,因为它没有ul
个孩子,也没有产品。
更新:
它可能需要2次删除,因为如果li包含一个ul,其li元素全部被删除,那么我们也想删除ul。
答案 0 :(得分:3)
$( "#top_nav li").filter( function(){
return !this.getElementsByTagName("ul").length && !+this.getAttribute("data-num-products");
}).remove();
只有在没有UL后代并且属性值为0
时才会删除答案 1 :(得分:1)
像这样:
$('#top_nav li[data-num-products="0"]:not(:has(ul))').remove();
选择器细分是......
'#top_nav' // start at element with "top_nav" id
' ' // and select descendant...
'li' // li elements...
'[data-num-products="0"]' // ...where attribute "data-num-products" is "0"
':not(' // ...but exclude li elements that...
':has(ul)' // ...have descendant ul elements
')'
关于您更新的问题,只需将:not(:has(ul))
更改为:not(:has(li))
。
$('#top_nav li[data-num-products="0"]:not(:has(li))').remove();
答案 2 :(得分:0)
$("#top_nav li[data-num-products='0']").filter(function() {
return $(this).children("ul").length === 0;
}).remove();
答案 3 :(得分:0)
在Javascript中:
var lis = document.querySelectorAll( '#top_nav li[data-num-products="0"]' );
for( var li = 0; li < lis.length; li++ ) {
!lis[li].getElementsByTagName( 'ul' ).length && lis[li].parentNode.removeChild( lis[li] );
};