2013-07-31 31 views
7

Ich habe viele div s, die manchmal Links enthalten. Ich möchte überprüfen, ob sie einen Link haben oder nicht. Dies ist mein Versuch:Überprüfen, ob ein Element ein bestimmtes Kindelement enthält

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

von container.html() tut ich den genauen Inhalt container einschließlich Anker-Tags sehen kann, aber mein Code oben wird immer sagen, dass es nicht den Anker-Tag findet.

Kann mir jemand sagen, was ich falsch mache?

+3

* 'Container + ': hat (a)'' * Was halten Sie das Ergebnis der 'der Anwendung + 'operator auf Operanden, die ein Objekt und eine Zeichenfolge sind? –

Antwort

8

Änderung dieser:

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

container ist ein jQuery-Objekt und .find() ist eine Funktion des Objekts, die Elemente innerhalb es findet. Eine Länge größer als 0 bedeutet, dass es ein Anker-Tag findet und es wird als wahr ausgewertet.

Edit:

, auch zu erklären, warum Ihr Beispiel nicht funktioniert. Wenn Sie container+':has(a)' tun, führen Sie eine Zeichenfolgenverkettung aus, die toString() auf Ihrem Objekt ausführt (in "[object Object]" konvertieren). Sie erhalten also die Zeichenfolge "[Objekt Objekt]: has (a)", die immer als wahr ausgewertet wird.

+0

Süß! Das funktioniert großartig. Danke – Lomse

+0

Guter Punkt. Man sollte eine Zeichenkette nicht mit einem Objekt verketten. Es wird einfach nicht funktionieren. Danke – Lomse

1

Sie können die length-Eigenschaft eines Selektors verwenden, um festzustellen, ob Elemente gefunden wurden. Versuchen Sie folgendes:

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

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

ändern

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

Um

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

Container ist ein jQuery-Objekt, kein Selektor-String

+0

Dies wird nicht funktionieren - hat() wird tatsächlich eine jquery-Objekt-Teilmenge von Container zurückgeben, die auf wahr ausgewertet wird, ob es Elemente enthält - http://jsfiddle.net/7V3Hy/3/ – smerny

+0

hat gerade festgestellt, dass "hat" Methode gibt jquery Objekt zurück, ty viel –

0

Mit freundlichen Grüßen wird funktionieren, wenn Sie es zu

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

In docs

Die mitgelieferte Wähler gegen die Nachkommen der Anpassungselemente getestet

+0

Dies funktioniert auch nicht, wenn Sie versuchen, Container mit einer Zeichenfolge zu verketten, wird es Container aus einem jquery-Objekt in eine Zeichenfolge konvertieren ("[Objekt-Objekt]"), dann erhalten Sie ein Syntaxfehler, wenn Sie versuchen, eine jquery von diesem zu erstellen. Dies würde funktionieren: 'container.has (" a "). Length ', aber es gibt keinen Grund zu überprüfen, ob'> 0' als 0 zu false ausgewertet wird und jedes andere Ergebnis als wahr ausgewertet würde. – smerny

Verwandte Themen