jQuery not selector似乎不适用于类

时间:2012-02-24 09:05:25

标签: jquery html dom cross-browser selector

好的另一个愚蠢的jQuery问题......

jQuery中的not选择器给了我一些问题。 我正在尝试选择除了第一个具有给定类toggle-button的元素之外的所有元素。但是我可以与控制台进行此对话......

? $('.toggle-button').length
4
? $('.toggle-button:not(:eq(0))').length
4

没有区别。但...

? $('div').length
23
? $('div:not(:eq(0))').length
22

什么给,Resig?

为什么not选择器在应用于类(看似)时会有不同的行为 - 如何以最惯用的jQuery方式进行我想要的选择?

:not(:first)做同样的事情......

更新

感谢所有回复。这看起来是jQuery / IE合作伙伴关系中的一个错误。

解决方案...

$('.toggle-button').filter(':gt(0)')

$('.toggle-button').not(':first')

$('.toggle-button').slice(0);

......毫无疑问还有更多。我会把它留给疯子来确定哪个是最好的:D

2 个答案:

答案 0 :(得分:2)

任何非CSS过滤/选择都应该通过jQuery方法完成,因为这意味着jQuery无法使用CSS来加速选择器。它尝试在浏览器中使用本机CSS支持,但如果使用:not:eq等,则必须使用自己的解析系统,这个系统速度较慢。

空气引用“正确”的方式是:

$('.toggle-button').filter(':gt(0)').length;

至于为什么:not表现不同,我不确定。我会继续思考,如果我得到一个灯泡,我会更新这个答案:)


编辑:它看起来像是一些特定于浏览器的怪癖 - 我刚刚完成了

  • $('.prettyprint').length - 3
  • $('.prettyprint:not(:eq(0))').length - 2
  • $('.question-header').length - 1
  • $('.question-header:not(:eq(0))').length - 0

对于这个页面,当我这样做时,这些数字是正确和可预测的。仔细检查你的代码是否存在愚蠢的拼写错误,以及那种情况,因为它看起来在这里工作正常。


编辑编辑:这是一个IE8错误,可能与它使用的CSS选择引擎有关。有关3种选择方法的概要,请参阅http://jsfiddle.net/5gSxP/2/,第一种方法在IE8中失败,但此答案中的一种方法正常。

答案 1 :(得分:1)

您可以使用.not()

使其更有效,更具可读性
$('div').not(':first').length;