好的另一个愚蠢的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
答案 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;