2009-04-13 13 views
14

il empty selector dice che: corrisponde a tutti gli elementi che non hanno figli (inclusi i nodi di testo).
Trova tutti gli elementi vuoti - non hanno elementi figli o testo.

Quello che voglio è ottenere elementi che non hanno figli ma possono avere testo all'interno., Come?Come ottenere elementi senza figli, ma potrebbe contenere del testo?



UPDATE:
Esempio:
voglio selezionare questi elementi, che non ha figli, ma possono avere il testo, con una sintassi simile a questo:

$('div:empty, a:empty, span, p:empty, td:empty, img, input').mousemove(myMouseOverHandler); 

risposta

27

Ottenere qualsiasi elemento che non ha nessun altro elemento:

$('*:not(:has(*))'); 
+3

Vale la pena ricordare che questo non funziona in senso inverso: "*: has (: not (*))" non riesce per qualche motivo interno. – Borgar

+1

Ha un certo senso se si pensa a come un motore di selezione CSS potrebbe essere in procinto di provare a interpretare i selettori. 'has' non dovrebbe essere necessario sapere come gestire' not'. Meglio ancora, cosa diavolo significherebbe "no" (*)? Come si tradurrebbe in ciò che vogliamo? In ogni caso, questa risposta è eccezionale perché ha salvato il mio bacon. –

19

Se un elemento ha solo testo, children() avrà una lunghezza di 0:

<div id="test1"> 
Hello World 
</div> 

<div id="test2"> 
<b>Hey there</b> 
</div> 

<script> 
alert($("#test1").children().length); // alerts 0 
alert($("#test2").children().length); // alerts 1 (the bold tag) 
</script> 

EDIT: In risposta alla tua modifica, jQuery è abbastanza impressionante per farvi fare filtri personalizzati:

$.expr[':'].emptyOrText = function(e) { 
    return $(e).children().length == 0; 
}; 

Quindi, utilizzando il sopra contro il codice HTML di cui sopra, si potrebbe fare questo:

$('div:emptyOrText'); // will select #test1 
+1

Immagino che stia cercando qualcosa come un selettore ": solo-testo". Il metodo children() aiuta solo se hai l'id. – kgiannakakis

+0

Sì, ho aggiornato la mia risposta per mostrare come farlo. –

+0

Bel tocco con il selettore personalizzato! Non c'è bisogno di usare il metodo 'estendi' però - basta fare jQuery.expr [':]. EmptyOrText = function() {...} – James

3

ho fatto un Javas puro funzione di cript per chiunque non voglia utilizzare jQuery.

const getElementsWithNoChildren = (target) => { 
    let candidates; 

    if (target && typeof target.querySelectorAll === 'function') { 
     candidates = target.querySelectorAll('*'); 
    } 
    else if (target && typeof target.length === 'number') { 
     candidates = target; 
    } 
    else { 
     candidates = document.querySelectorAll('*'); 
    } 

    return Array.from(candidates).filter((elem) => { 
     return elem.children.length === 0; 
    }); 
}; 
Problemi correlati