给定一些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()
的存在意味着期望这不是不合理的...... )。
答案 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');
使用您的示例