“全部但不是” jQuery选择器


89

我可以选择(使用jQuery)HTML标记中的所有div,如下所示:

$('div')

但我想从上述选择中排除特定的内容div(例如具有id="myid")。

如何使用Jquery函数做到这一点?


2
在jquery中使用not选择器
Abhijit 2011年

Answers:


171

简单:

$('div').not('#myid');

使用.not()会从返回的集合中移除与选择器匹配的元素$('div')

您还可以使用:not()选择器:

$('div:not(#myid)');

两个选择器的功能相同,但是:not()速度更快,这大概是因为jQuery的选择器引擎Sizzle可以将其优化为本地.querySelectorAll()调用。


1
@Raynos我不认为这是必然不好,但使用.not()远远不如:not()
Bojangles

1
我认为应该是$('div:not(#myid)');(不含引号)。@Raynos:为什么?:not()是CSS3选择器。jQuery可以直接将选择器传递给querySelectorAll如果支持的话...
Felix Kling

@FelixKling可以作为选择器4的一部分。但是在jQuery中,它的速度较慢.not且可读性较差。我应该说“:jQuery中的非选择器”
Raynos

@Raynos:没有Selectors规范允许在中使用引号:not()。该选择器不是选择器4的新增功能,也没有进行更改以允许使用引号。不过,已对其进行了更改,以允许使用更复杂的选择器。除非我误解了您的评论...
BoltClock

1
@PeterKrauss我刚刚做了一个jsPerf基准测试,标记querySelectorAll为最快。这不是一个现实的基准,但是可以预期,由于jQuery内部没有任何开销。:not()实际上更快,大概是因为Sizzle知道它可以优化它的使用querySelectorAll()
Bojangles

9
var els = toArray(document.getElementsByTagName("div"));
els.splice(els.indexOf(document.getElementById("someId"), 1);

您可以按照老式的方式进行操作。不需要jQuery这么简单的东西。

专业提示:

一组dom元素只是一个数组,因此请toArray在上使用您喜欢的方法NodeList

将元素添加到集合中只是

set.push.apply(set, arrOfElements);

从集合中删除元素是

set.splice(set.indexOf(el), 1)

您不能一次轻松地删除多个元素:(


1
在如今(2017年),也许使用本机Javascript.querySelector().querySelectorAll()with div:not(#myid) 的速度更快...是吗?
彼得·克劳斯


4
   var elements =  $('div').not('#myid');

这将包括ID为“ myid”的所有div。




3

您使用.notjQuery库的属性:

$('div').not('#myDiv').css('background-color', '#000000');

看到它在这里行动。div #myDiv将为白色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.