2013-07-31 12 views
7

Mam wiele div s, które czasami zawierają linki. Chcę sprawdzić, czy mają link. To moja próba:Sprawdź, czy element zawiera określony element podrzędny.

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

Robiąc container.html() mogę zobaczyć dokładną treść container tym tagów kotwicznych, ale mój powyższy kod będzie zawsze powiedzieć, że nie może znaleźć znacznika zakotwiczenia.

Czy ktoś może mi powiedzieć, co robię źle?

+3

* 'pojemnik + ': ma (a)'' * Co sądzisz o wyniku zastosowania '+ 'operator na operandach, które są obiektem i łańcuchem? –

Odpowiedz

8

Zmiana ta:

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

container jest obiekt jQuery i .find() jest funkcją tego obiektu, która znajduje się w nim elementy. Długość większa od 0 oznacza, że ​​znajdzie znacznik zakotwiczenia i oceni się jako prawdziwy.

Edit:

Ponadto, aby wyjaśnić, dlaczego Twój przykład nie działa. Kiedy wykonujesz container+':has(a)', robisz konkatenację ciągów, która uruchamia toString() na twoim obiekcie (konwertując go na "[obiekt obiektu]"). Tak więc kończy się ciągiem "[object Object]: has (a)", który zawsze będzie się sprawdzał jako true.

+0

Słodki! Działa to świetnie. Dzięki – Lomse

+0

Dobra uwaga. Nie należy łączyć ciągu z obiektem. Po prostu nie działa. Dzięki – Lomse

1

Można użyć właściwości selektora length w celu ustalenia, czy znaleziono jakieś elementy. Spróbuj tego:

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

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

Zmień

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

Aby

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

pojemnik jest obiektem jQuery, a nie ciąg selektor

+0

To nie zadziała - has() faktycznie zwróci podzbiór obiektów jquery kontenera, który oceni na true, czy zawiera elementy - http://jsfiddle.net/7V3Hy/3/ – smerny

+0

właśnie zdał sobie sprawę, że "ma" metoda zwraca obiekt jquery, ty dużo –

0

Yours będzie działać, jeśli go zmienić na

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

In docs

Przełącznik dostarczany jest testowany przed potomkami elementów pasujących

+0

To też nie zadziała, gdy spróbujesz połączyć kontener z łańcuchem, przekształci on kontener z obiektu jquery w ciąg znaków ("[object Object]"), wtedy otrzymasz błąd składni podczas próby utworzenia jquery z tego. To zadziałałoby: 'container.has (" a "). Length', ale nie ma powodu, aby sprawdzać, czy'> 0' jako 0 będzie oceniało fałsz, a jakikolwiek inny wynik zostanie oceniony jako prawdziwy. – smerny