2009-06-08 17 views
62

que tienen¿Qué selector de JQuery excluye elementos con un elemento primario que coincida con un selector dado?

var $set = $('.foo,.bar').filter(
    function() {return $(this).parents('.baz').length < 1;}); 

como una manera de seleccionar todos los elementos cuyas clases son o bien foo o bar y que no descienden de un elemento cuya clase es baz. ¿Hay un selector que logre lo mismo sin la necesidad de un filtro lambda?

<div class='foo'/><!--match this--> 
<div class='bar'/><!--match this--> 
<div class='baz'> 
    <div class='foo'/> <!--don't match this--> 
</div> 
+2

de todas las respuestas que me gusta la forma en que está haciendo mejor. – Dean

+2

puede usar el método 'más cercano' en lugar de' padres' para hacerlo más rápido. 'closer' se detiene una vez que encuentra un elemento coincidente mientras' parents' recorre el árbol DOM hasta el elemento raíz del documento para encontrar elementos coincidentes. – RayOnAir

Respuesta

72

La verdad del asunto es que jQuery simplemente no tiene una manera particularmente elegante de hacer lo que quiera. Si bien la respuesta de caos funciona, debe preguntarse si el selector complicado (que sería tan lento como un selector en una página web complicada) lo vale más que la función de filtro más detallada pero más rápida que tiene. Esto no es tan importante, estoy cansado de los selectores especialmente largos y complicados cuando puedo evitarlo.

Una opción diferente es la creación de su propio selector, ya que jQuery es impresionante:

jQuery.expr[':'].parents = function(a,i,m){ 
    return jQuery(a).parents(m[3]).length < 1; 
}; 

$('.foo,.bar').filter(':parents(.baz)'); 

El mapa expr es parte del motor selector de chisporroteo y la documentación se puede encontrar aquí: Sizzle Custom Pseudo-Selectors

+0

aceptando porque es más completo que el caos ', ¿dónde encuentro la documentación en la API para la matriz expr? –

+0

No hay ninguno, hasta donde yo sé. –

+0

Esta respuesta resolvió un problema similar para mí. +1 – friedo

28
$('.foo:not(.baz .foo),.bar:not(.baz .bar)') 
0

Añadir a: ('baz') no es de su selector de nivel superior.

1

El selector caos da debería funcionar:

$('.foo:not(.baz .foo),.bar:not(.baz .bar)') 

Sólo quería darle un consejo sobre una extensión de FireBug llamada FireFinder que se puede utilizar para probar sus selectores CSS/jQuery.

Desde el sitio web: Firefinder es una extensión de Firebug (en Firefox) y ofrece la funcionalidad para encontrar de manera rápida elementos HTML que coincidan con los selectores CSS seleccionados o la expresión XPath. Le permite probar instantáneamente sus selectores CSS en la página mientras ve el contenido al mismo tiempo, y se resaltarán los elementos coincidentes.

+0

+1 por introducirme en FireFinder – Dean

14

no pude 't conseguir que esto funcione:

$(".children:not(#parent .children)"); 

pero puedo conseguir que esto funcione:

$(".children").not($("#parent .children")); 

Nota: No estoy seguro si esto tiene algo que ver con la versión de jQuery que estoy usando 1.2.6

+0

Usar '$(). Not()' es la solución más simple. Y está bien [documentado] (http://api.jquery.com/not/) para hacer exactamente lo que se ha pedido. – peter

1

var $li = jQuery('li', this).not('.dropdown-menu > li');

estoy usando el tema Raíces y cambian los menús desplegables de 'sub menú 'a' menú .dropdown'

2

prueba este:

   $('div') 
       .filter(function() { 

        return ($(this).parent().not('.baz')); 
       }) 
Cuestiones relacionadas