2011-11-22 10 views
17

Ho una situazione in cui ho bisogno di selezionare tutti i discendenti di un certo elemento, ma esclude quelli che sono figli di un contenitore uguale alla classe CSS del contenitore su cui eseguo il mio selettore.Utilizzare jQuery per ottenere discendenti di un elemento che non sono figli di un contenitore con una determinata classe CSS

Descrizione piuttosto complicata.

<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> 

Esecuzione di un jQuery .find ('elemento') sulla DIV esterno mi otterrà tutti i div, anche quelli all'interno del secondo contenitore. Questo è quello che cerco di evitare.

Esiste una soluzione di selezione jQuery semplice e rapida per questo caso?

+0

può puntare a me che gli elementi che si desidera selezionato? – BoltClock

+0

In questo caso, i 4 DIV al livello 1 con la classe "elemento" – SquareCat

risposta

25

Penso che quello che si desidera utilizzare è il selettore not. Ti piace questa ..

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

In alternativa, è possibile utilizzare il selettore children, per ottenere i bambini da un livello profondo. Quale escluderebbe i div nidificati.

Per essere un po 'più esplicito, penso che vorrete usare il non selettore dopo aver usato il' find '. Come questo:

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

Si può passare una funzione di no, quindi si potrebbe avere quello sguardo funzione ai genitori di ogni partita elemento per vedere se è annidato all'interno di un elemento con la stessa classe.

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); 

Se si potrebbe aggiungere una classe al contenitore nidificato, che sarebbe l'ideale, quindi è solo:

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

Supponendo che si è aggiunto alla classe "annidati", al tuo contenitore interno div.

+0

Questo è molto bello sapere! Nel mio caso particolare, i bambini() erano più adatti. Ma grazie mille per aver portato la mia attenzione su no(). In ogni caso i bambini() hanno fatto il lavoro. Finché non mi viene in mente un caso in cui devono essere supportati più livelli. – SquareCat

+0

Ho scoperto che ho avuto casi in cui i DIV sono nidificati all'interno dei contenitori di nuovo, motivo per cui ho dovuto scaricare i bambini(). Usare not() sembra una buona idea, ma il problema è: quale selettore usare con not() per abbinare il contenitore genitore (non direttamente i bambini)? – SquareCat

+0

Grazie per questo suggerimento. Ho provato ad applicarlo ma non ci sono riuscito. Ho scoperto che potrebbe essere più semplice se applicassi una classe CSS aggiuntiva a tutti i contenitori discendenti, in modo da poterli escludere facilmente. Ma ora non mi sembra di capire quale selettore usare per selezionare tutti i DIV .container usando .find() e per escludere tutti gli elementi figli di un elemento con una classe css specifica. - eri più veloce. Lasciatemi provare ad applicare la tua ultima soluzione. – SquareCat

2

Per esempio specifico questo dovrebbe funzionare -

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

che non potrà che ottenere i migliori div elemento di livello. Se la tua raccolta di elementi era in una struttura diversa, potresti sostituire body con l'id del contenitore della raccolta.

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

+0

Non riesco ad applicare questa soluzione anche se l'esempio sopra descritto è semplificato, la situazione attuale è un po 'più complicata. Ma grazie. – SquareCat

0

È possibile utilizzare il selettore jQuery come questo:

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

Da: https://api.jquery.com/all-selector/ .... ** Attenzione: il selettore all, o universal, è estremamente lento, tranne se usato da solo. ** Solo così sai ... – Marcky

Problemi correlati