【问题标题】:jQuery not selector doesn't appear to work with classjQuery not selector 似乎不适用于类
【发布时间】:2012-02-24 17:33:04
【问题描述】:

好吧,另一个愚蠢的 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

什么给了,雷西格?

为什么not 选择器在应用于类时会有不同的行为(似乎) - 我怎样才能以最惯用的 jQuery 方式进行选择?

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

更新

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

解决方案...

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

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

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

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

【问题讨论】:

  • 为我工作jsfiddle。也许您的代码中还有其他东西阻止了预期的行为。
  • @DidierGhys 谢谢,看起来这是一个 Internet Exploder 问题 (:O),因为它适用于我的 Chrome,但不适用于 IE....

标签: jquery html dom cross-browser selector


【解决方案1】:

任何非 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 中失败,但在此答案中的方法正常。

【讨论】:

  • 谢谢,这行得通。我真的很想知道为什么!我会等你的灯泡。你是说gt 使用原生 CSS 吗?
  • 有一个小灯泡,请参阅帖子 :P 不,:gt 不使用 CSS,这就是为什么它位于 .filter() 而不是主选择器中的原因。一般的经验法则是“如果是 CSS 选择器,则进入 $(),否则进入 .filter().not().find() 等 - jQuery 选择方法。
  • 使用 Didier 的 jsFiddle 在 IE8 中测试,并使用我的方法进行了更新 - 在 IE8 中按预期工作 :) jsfiddle.net/5gSxP/2
【解决方案2】:

您可以使用.not() 使其工作并更具可读性:

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

【讨论】:

  • 谢谢,这也可以——虽然我的选择器是$('.toggle-button')... :)
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2013-02-15
  • 1970-01-01
  • 2013-10-30
  • 2013-04-23
  • 1970-01-01
相关资源
最近更新 更多