2013-07-31 7 views
7

У меня есть много div s, которые иногда содержат ссылки. Я хочу проверить, есть ли у них ссылка. Это моя попытка:Проверьте, содержит ли элемент определенный дочерний элемент

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

Поступая container.html() я могу увидеть точное содержание container включая якорные тег, но мой код выше будет всегда говорить, что он не может найти якорь тега.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

+3

* 'контейнер + ': есть (а)' '* Как вы думаете, в результате применения' + 'оператор на операндах, которые являются объектом и строкой? –

ответ

8

Изменение к этому:

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

container является объектом JQuery и .find() является функцией этого объекта, который находит элементы внутри него. Длина, превышающая 0, будет означать, что она найдет привязную метку и будет оцениваться как истина.

Edit:

Кроме того, чтобы объяснить, почему ваш пример не работает. Когда вы делаете container+':has(a)', вы выполняете конкатенацию строк, которая запускает toString() на вашем объекте (преобразует его в «объект объекта»). Таким образом, вы получаете строку «[object Object]: has (a)», которая всегда будет оцениваться как true.

+0

Sweet! Это отлично работает. Спасибо – Lomse

+0

Хорошая точка. Не следует конкатенировать строку с объектом. Это просто не работает. Спасибо – Lomse

1

Вы можете использовать свойство селектора length, чтобы определить, были ли найдены какие-либо элементы. Попробуйте это:

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

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

Изменить

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

Для

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

контейнер является JQuery объект, а не строка селектор

+0

Это не сработает - has() фактически вернет подмножество объекта jquery контейнера, который будет оценивать значение true, содержит ли он элементы или нет: http://jsfiddle.net/7V3Hy/3/ – smerny

+0

только что понял, что 'has' метод возвращает объект jquery, ty много –

0

Ваш будет работать, если вы измените его на

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

In docs

Прилагаемый селектор сверяется потомков элементов согласующих

+0

Это тоже не сработает, когда вы попытаетесь объединить контейнер со строкой, он преобразует контейнер из объекта jquery в строку («[Object Object]»), тогда вы получите когда вы пытаетесь создать jquery из этого. Это будет работать: 'container.has (« a »). Length', но нет причин проверять, будет ли'> 0', поскольку 0 будет оцениваться как false, а любой другой результат будет равен true. – smerny