3

我想选择除第一个孩子之外的所有 li 和所有不包含的 li:ab 2

所以,如果我的清单是:

<ul id="list">
    <li>1</li>
    <li>ab 1</li>
    <li>ab 2</li>
    <li>ab 3</li>
    <li>ab 4</li>
</ul>

这将是:

<ul id="list">
    <li>1</li>
    <li>ab 2</li>
</ul>

我试过了:

$("#list").find("li:not(:first-child), li:not(:contains('ab 2'))").each(function () {
      var current = $(this);
      current.css('display', 'none');
}

但我所有的清单都不见了..

4

9 回答 9

5

这应该很快:

$("#list li")
    .slice(1) // exclude the first
    .not(':contains(ab 2)') // exclude all "ab 2"

要删除它们,只需调用.remove()or.hide()最后,无需循环。

演示:http: //jsfiddle.net/tY4cm/

这是此处发布的不同解决方案的 jsPerf:http: //jsperf.com/single-selector-vs-filter-perf/2

于 2013-07-27T11:52:51.550 回答
3

要删除除第一个孩子和任何 LI 之外的所有内容ab 2,请执行以下操作:

$('#list li:not(:contains(ab 2), :first-child)').hide();

小提琴

于 2013-07-27T11:37:18.513 回答
1

尝试这个

$("#list").find("li:gt(0):not(:contains('ab 2'))").css('display', 'none');
于 2013-07-27T11:47:11.823 回答
1
$("#list").find("li:gt(0):not(:contains('ab 2'))")

演示

于 2013-07-27T11:37:28.893 回答
1

尝试这个:

$("#list li").each(function () {
    var $this = $(this);
    if($this.text() == 'ab 2' || $this.is(':first-child')) { return; }

    // your code
}

如果您each无论如何都要做一个函数,我认为没有理由使用如此复杂的查询字符串。

于 2013-07-27T11:34:30.750 回答
1

选择,用作or ; 即不是第一个子元素或不包含“ab 2”的所有元素;这导致所有元素都匹配。

相反,只需使用;

li:not(:first-child):not(:contains('ab 2')

...作为您的选择器(http://jsfiddle.net/rrWky/

于 2013-07-27T11:37:08.590 回答
1

不确定包含功能:

$("#list li:gt(0)").not(":contains('ab 2')").each(function(){
        // code
        this.style.display='none'; // try to use native JS where possible
    });

如果隐藏是您唯一想做的事情,请不要循环,只需隐藏:

$("#list li:gt(0)").not(":contains('ab 2')").hide();

性能方面,您可以测试这是否会更快:

 $("#list").find("li").not(":first-child") // or
 $("#list li").not(":first-child") // or
 $("#list li:not(:first-child)")

添加了过滤器(为了可读性没有这样做)

于 2013-07-27T11:37:13.513 回答
1
$("li:gt(0):not(:contains('ab 2'))").css('color','red');

http://jsfiddle.net/fmhYN/

您可以稍微修改选择器的开头以满足您的需要。

于 2013-07-27T11:37:14.707 回答
0

尝试将您的代码更改为:

$("#list").find("li:not(:first-child)").filter("li:not(:contains('ab 2'))").each(function () {
      var current = $(this);
      current.css('display', 'none');
});

是建议答案的jsFiddle。

您还可以删除过滤器并组合两个选择器,如下所示:

$("#list").find("li:not(:first-child):not(:contains('ab 2'))").each(function () {
      var current = $(this);
      current.css('display', 'none');
});

是正在组合的选择器的 jsFiddle。

于 2013-07-27T11:37:35.483 回答