2012-02-24 38 views
1

好的另一个愚蠢的jQuery问题工作...jQuery的不选择不会出现与

not选择在jQuery是给我的问题。 我试图选择除了具有给定类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)做同样的事情......

UPDATE

感谢所有响应。这看起来是jQuery/IE合作伙伴中的一个错误。

解决方案...

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

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

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

...毫无疑问更多。我将把它留给crazies来确定哪个是最好的:D

+1

对我的作品[的jsfiddle(http://jsfiddle.net/didierg/5gSxP/)。也许在你的代码中有其他的东西阻止了预期的行为。 – 2012-02-24 09:13:38

+0

@DidierGhys谢谢,看起来这是一个互联网爆问题(:O),因为它在Chrome对我的作品而不是IE .... – 2012-02-24 09:20:42

回答

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选择引擎做。请参阅http://jsfiddle.net/5gSxP/2/以了解3种选择方法,第一种在IE8中失败,但此答案中的一种可以正常工作。

+0

谢谢,这工作。尽管我真的很想知道*为什么!我会等你的灯泡。你是说'gt'使用原生CSS吗? – 2012-02-24 09:14:37

+0

有一个小灯泡,看帖子:P不,':gt'不使用CSS这就是为什么它在'.filter的()',而不是在主选择。一般的经验法则是“如果这是一个CSS选择器,它会在'$()',否则它会在'.filter()','。不是()','.find()'等等 - 的jQuery ?选择方法 – Joe 2012-02-24 09:16:10

+0

哪个浏览器你做你的测试,我在爆8 ......经测试,在IE8 – 2012-02-24 09:16:44

1

你可以让它工作,更具可读性与.not()

$('div').not(':first').length; 
+0

谢谢,这也适用 - 尽管我的选择器是'$('。toggle-button')...':) – 2012-02-24 09:18:39