11

我有一个简单的 js 脚本,可以计算无序列表的子节点数。我正在尝试更改脚本,因此它不计算任何包含类“hiddenItem”的div的子项(li)。这是列表和js。

    <ul id="dlist" class="sortable">
        <li id="listItem_000002">
            <div>
                <div><a class="itemCollapse"></a>
                </div>Item 2</div>
        </li>
        <li id="listItem_000003">
            <div>
                <div><a class="itemCollapse"></a>
                </div>Item 3</div>
        </li>
        <li id="listItem_000009">
            <div>
                <div><a class="itemCollapse"></a>
                </div>Item 9</div>
        </li>
        <li id="listItem_000012">
            <div class="hiddenItem">
                <div><a class="itemCollapse"></a>
                </div>Item 12 (Hidden)</div>
        </li>
    </ul>
    <br>
    <br>

    <a class="count">Count</a>

.

    $(".count").click(function () {
        var tcount = $("#dlist").children("li").length;
        alert(tcount);
    });

在此示例中,js 提醒有 4 个项目。但是,我正在尝试更改代码,以便它提醒 3 个项目,因为最后一个列表项包含具有类“hiddenItem”的 div。我尝试使用 .filter() 以及其他一些横向方法,但没有成功。有人有更好的主意吗?

这是一个工作小提琴:http: //jsfiddle.net/YeDdq/1/

任何帮助,将不胜感激。谢谢!

4

5 回答 5

13

你可以使用not方法。

var tcount = $("#dlist > li").not(':has(div.hiddenItem)').length;

filter方法:

var tcount = $("#dlist > li").filter(function(){
                 return $('div.hiddenItem', this).length === 0;
             }).length;
于 2013-02-08T09:11:40.850 回答
5

.not有效,并且更具可读性:

$('#dlist > li').not('.hiddenItem').length;

编辑:刚刚意识到第一个答案也有 .not 列出,但我不确定他们为什么用has伪类让它变得如此复杂。

于 2013-12-21T01:58:43.980 回答
1

在这种情况下,过滤器绝对应该是你想要的。从你的小提琴:

$(".count").click(function () {
    var tcount = $("#dlist").children("li")
    .filter(function() { return !($(this).children().is('.hiddenItem')); })
    .length;
    alert(tcount);
});

我已经更新了你的小提琴以反映这一点:http: //jsfiddle.net/YeDdq/8/

于 2013-02-08T09:13:19.897 回答
1

您可以使用 :not 和 :has 选择器

$(function() {
    var tcount = $("#dlist li:not(:has(.hiddenItem))").length;
    alert(tcount);
});
于 2013-02-08T09:26:59.740 回答
0

试试这个:

var tcount = $("#dlist > li").filter(function(){
                                         return $(this).find(".hiddenItem")
                                                       .length==0;
                                     }).length
于 2013-02-08T09:17:52.403 回答