jQuery方法选择一个子集,还有它的逆?
给定一些jQuery对象集,以及该集合的子集,是否有一个方法可以返回逆子集?
如果答案是“ 否 ”,有没有办法避免进行第二次选择以得到逆子集?
解释性的例子:
首先,我想对所有
.subset
某些.subset
,最后对其他内容执行.inverse
:
$('li').css('background-color','blue') .filter('.subset') .css('color','black') .inverse() // <-- White Whale?!? .css('color','white');
我知道这可以通过.end().filter('.inverse')
轻松完成,但是假设选择器实际上很大而且很讨厌并且运行它两次将是一个很大的性能影响 。 然后怎样呢?
在API文档中没有找到这样的东西,但我是jQuery的新手并且可能忽略了一些明显的东西(同样, .andSelf()
的存在意味着期望这不是不合理的……)。
对此没有内置function,反向滤波器就是您所追求的……替代方案是无法链接的。 替代方案是.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');
这是我刚刚制作的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/