jQuery方法选择一个子集,还有它的逆?

时间:2010-12-21 18:18:22

标签: jquery

给定一些jQuery对象集,以及该集合的子集,是否有一种方法可以返回反向子集?

如果答案是“”,有没有办法避免让第二次选择来获得逆子集?

解释性示例:

<ul>
  <li class="subset"></li>
  <li class="subset"></li>
  <li class="inverse"></li>
  <li class="inverse"></li>
</ul>

首先,我想对所有<li>执行某些操作,然后只对.subset执行某些操作,最后只对.inverse执行其他操作:

$('li').css('background-color','blue')
  .filter('.subset')
    .css('color','black')
  .inverse()  // <-- White Whale?!?
    .css('color','white');

我知道这可以通过.end().filter('.inverse')轻松完成,但假设选择器实际上是讨厌并且运行两次将是一个很大的性能提升。那么呢?

在API文档中没有找到这样的东西,但我是jQuery的新手并且可能忽略了一些明显的东西(同样,.andSelf()的存在意味着期望这不是不合理的...... )。

2 个答案:

答案 0 :(得分:5)

没有内置功能,反向滤波器就是您所追求的......替代方案是无法链接的。替代方案是.not(),如下所示:

var all = $('li').css('background-color','blue');
var sub = all.filter('.subset').css('color','black');
all.not(sub).css('color','white');

......但又不是很漂亮,我坚持使用.end().filter()方法。但是,如果性能是最重要的,使用上面的.not()方法,它会更有效(因为没有选择器运行反向集)。


对于您的具体示例(虽然不是一般性问题),这样做很快:

$('li').css('background-color','blue').css('color','white')
       .filter('.subset').css('color','black');

答案 1 :(得分:1)

这是我刚刚制作的关于它的jquery的一个小扩展..

(function($) {
  $.fn.reverse = function () 
  {
      var orig = this.prevObject || jQuery(null);
      return orig.not(this);
  }
})(jQuery);

它将保持链接,因此您仍然可以在.end()之后执行并返回到之前的过滤。

您可以将其称为

$('li').css('background-color','blue')
  .filter('.subset')
    .css('color','black')
  .reverse()  // <-- White Whale?!?
    .css('color','white');
使用您的示例

演示http://www.jsfiddle.net/gaby/THLkn/