2013-07-31 31 views
7

Ho molti div s che a volte contengono collegamenti. Voglio controllare se hanno un link o meno. Questo è il mio tentativo:Verificare se un elemento contiene un elemento figlio specifico

var container = $(this).closest('.content').find('.text'); 

    //Check if text contains a tags 
    if(container+':has(a)'){ 
     alert('contain link'); 
    } 
    else{ 
     alert('no link found'); //Alert "contain link" even if no link is found. 
    } 

Facendo container.html() posso vedere il contenuto esatto di container tra cui tag di ancoraggio, ma il mio codice di cui sopra sarà sempre dire che non riesce a trovare il tag di ancoraggio.

Qualcuno potrebbe dirmi che cosa sto facendo male?

+3

* 'contenitore + ': ha (a)'' * Cosa pensa il risultato dell'applicazione del '+ 'Operatore su operandi che sono un oggetto e una stringa sarà? –

risposta

8

Change a questo:

if(container.find("a").length){ ... 

container è un oggetto jQuery e .find() è una funzione di quell'oggetto che trova elementi all'interno di esso. Una lunghezza maggiore di 0 significherà che trova un tag di ancoraggio e che valuterà il vero.

Edit:

Inoltre, per spiegare il motivo per cui il tuo esempio non funziona. Quando si esegue container+':has(a)', si esegue una concatenazione di stringhe che esegue toString() sul proprio oggetto (convertendolo in "[oggetto oggetto]"). Quindi finisci con la stringa "[oggetto oggetto]: ha (a)" che valuterà sempre il vero.

+0

Dolce! Funziona alla grande Grazie – Lomse

+0

Buon punto. Non si dovrebbe concatenare una stringa con un oggetto. Non funzionerà. Grazie – Lomse

1

È possibile utilizzare la proprietà length di un selettore per determinare se sono stati trovati elementi. Prova questo:

var $container = $(this).closest('.content').find('.text'); 

if ($('a', $container).length) { 
    alert('Contains links'); 
} 
else { 
    alert('No links found'); 
} 
1

Change

if(container+':has(a)'){ 

Per

if(container.has('a').size()){ 

contenitore è un oggetto jQuery, non una stringa di selezione

+0

Questo non funzionerà - ha() in realtà restituirà un sottoinsieme di oggetti jquery del contenitore che valuterà se sia vero o meno che contiene elementi - http://jsfiddle.net/7V3Hy/3/ – smerny

+0

appena realizzato che 'ha' metodo restituisce oggetto jquery, ty un sacco –

0

Distinti funzionerà se si cambia a

if($(container+":has(a)").length > 0){ 

In docs

Il selettore in dotazione è testato contro i discendenti degli elementi corrispondenti

+0

Questo non funzionerà neanche, quando provate a concatenare un contenitore con una stringa, convertirà il contenitore da un oggetto jquery in una stringa ("[oggetto oggetto]"), quindi otterrete un errore di sintassi quando si tenta di creare un jquery da quello. Funzionerebbe: 'container.has (" a "). Length', ma non c'è motivo di verificare se'> 0' dato che 0 valuterà in falso e qualsiasi altro risultato verrebbe valutato in true. – smerny

Problemi correlati