我有过
var $set = $('.foo,.bar').filter(
function() {return $(this).parents('.baz').length < 1;});
作为选择其类为foo
或bar
的所有元素的一种方式,并且这些元素不是其类为baz
的元素的后代。有没有一个选择器可以在不需要过滤lambda的情况下完成同样的事情?
<div class='foo'/><!--match this-->
<div class='bar'/><!--match this-->
<div class='baz'>
<div class='foo'/> <!--don't match this-->
</div>
发布于 2009-06-08 17:13:26
事情的真相是,jQuery根本没有一种特别优雅的方法来做你想做的事情。虽然chaos的答案确实有效,但你不得不怀疑,与你拥有的更冗长但更快的过滤功能相比,复杂的选择器(它的速度与复杂网页中的选择器的速度一样慢)是否值得。这真的不是什么大问题,我个人只是厌倦了当我可以避免的时候,特别长的,令人费解的选择器。
另一种选择是创建自己的选择器,因为jQuery非常棒:
jQuery.expr[':'].parents = function(a,i,m){
return jQuery(a).parents(m[3]).length < 1;
};
$('.foo,.bar').filter(':parents(.baz)');
Sizzle映射是expr
选择器引擎的一部分,可以在以下位置找到文档:Sizzle Custom Pseudo-Selectors
发布于 2009-06-08 16:44:15
$('.foo:not(.baz .foo),.bar:not(.baz .bar)')
发布于 2009-09-28 05:12:54
我不能让它工作:
$(".children:not(#parent .children)");
但我可以让它起作用:
$(".children").not($("#parent .children"));
注意:不确定这是否与我使用的1.2.6版本的jQuery有关
https://stackoverflow.com/questions/965816
复制相似问题