2011-11-22 9 views
17

Tengo una situación en la que necesito seleccionar todos los descendientes de un elemento determinado, pero excluyen los que son hijos de un contenedor que es igual a la clase CSS del contenedor en el que ejecuto mi selector.Usar jQuery para obtener descendientes de un elemento que no son secundarios de un contenedor con una clase de CSS determinada

Descripción bastante complicada.

<div class="container"> 
    <div class="element"></div> 
    <div class="element"></div> 
    <div class="element"></div> 
    <div class="element"> 
     <div class="container"> 
      <div class="element"></div> 
      <div class="element"></div> 
      <div class="element"></div> 
     </div> 
    </div> 

Ejecución de un jQuery .find ('elemento') en el DIV exterior me llevará todos los DIVs, incluso los más interior del segundo recipiente. Eso es lo que trato de evitar.

¿Hay una solución de selector jQuery rápida y sencilla para este caso?

+0

Se puede apuntar a mí que los elementos que desea seleccionado? – BoltClock

+0

En este caso, los 4 DIV en el nivel 1 con la clase "elemento" – SquareCat

Respuesta

25

Creo que lo que quiere usar es el selector not. Como esto ..

$(".container").not(".container .container") 

Alternativamente, se puede utilizar el selector children, para llegar a los niños de un nivel de profundidad. Que excluiría los divs anidados.

Para ser un poco más explícito, creo que querrá usar el selector de no después de usar 'buscar'. De esta manera:

$(".container").find(".element").not($(".container .container .element")) 

se puede pasar a una función no es así, lo que podría tener ese aspecto en función de los padres de cada partido elemento para ver si está anidado dentro de un elemento con la misma clase.

http://jsfiddle.net/QXfs2/6/

removeIfNested = function(index) { 
    // this is the corrent DOM element 
    var $this = $(this), 
     return_value = false; 

    $.each($this.attr('class').split(/\s+/), function(index) { 
     if ($this.parents("." + this).length > 0) { 
      return_value = default_value || true; 
     } 
    }); 

    return return_value; 
} 


$(".container").find(".element").not(removeIfNested); 

Si usted podría agregar una clase al contenedor anidado, que sería lo ideal, entonces es simplemente:

$(".container").find(".element").not($(".nested .element")) 

Suponiendo que ha añadido la clase "anidados", a su contenedor interno div.

+0

¡Es muy bueno saberlo! En mi caso particular, los niños() fueron más adecuados. Pero muchas gracias por llamar mi atención a no(). En cualquier caso, los niños() hicieron el trabajo. Hasta que aparezca un caso en el que se admitirán múltiples niveles. – SquareCat

+0

Encontré que había casos en los que los DIV estaban anidados dentro de los contenedores, por lo que tuve que volcar hijos(). Usar not() parece una buena idea, pero el problema es: ¿qué selector usar con not() para hacer coincidir el contenedor principal (no los hijos directamente)? – SquareCat

+0

Gracias por esa pista. Intenté aplicarlo pero no lo logré. Me di cuenta de que podría ser más fácil si sólo aplica una clase CSS adicional para todos los contenedores descendientes, de modo que yo sólo podía excluir a ellos fácilmente. Pero ahora no parecen ser i descubrir lo selector para utilizar con el fin de seleccionar todos los DIVs .container utilizando .find() y para excluir todos los elementos que son hijos de un elemento con una clase CSS específico. - fuiste más rápido. Déjame intentar aplicar tu última solución. – SquareCat

2

Para su ejemplo específico que esto funcionaría -

$("body > div.container > .element") 

Eso sólo va a los divs elemento de nivel superior. Si su colección de elementos estaba en una estructura diferente, puede sustituir body con el identificador de contenedor de la colección.

Demo - http://jsfiddle.net/QAP37/

+0

no puede aplicar esta solución, ya pesar de que se simplifica el ejemplo descrito anteriormente, la situación real es un poco más complicado. Pero gracias. De – SquareCat

0

Usted puede utilizar el selector de jQuery como esto:

find('*:not(.container .container *)') 
+1

: https://api.jquery.com/all-selector/ .... ** Precaución:. El todo, o universal, el selector es extremadamente lento, excepto cuando se utiliza por sí mismo ** Para que lo sepas ... – Marcky

Cuestiones relacionadas