2012-02-09 2 views
6

Я пытаюсь что-то сделать, если div содержит определенный элемент, но, похоже, не может вызвать условие. Вот мой лучший выстрел.Протестируйте, если div не имеет элемента

<div class='test'> 
    testing123 
</div> 

<div class='test'> 
    <p>testing456</p> 
</div> 

$('.test').each(function(){ 
    if(!$(this).has('p')) { 
     $(this).addClass('red'); 
    } 
}); 

сценарий просто нацелен на абсолютно все. Вот живая скрипка - http://jsbin.com/igoyuk/edit#javascript,html,live

ответ

11

Знайте, что .has()возвращает jQuery, а не логический!

.has (селектор) Возвращает: JQuery
Описание: Уменьшить набор соответствующих элементов до тех, которые имеют потомка, который соответствует селектор или DOM элемента.

Выполнение if(!$(this).has('p')) всегда верно, поскольку jQuery всегда возвращает набор, даже если он пуст!

.has() в основном фильтрует набор он призван, так что вы просто должны сделать:

$('.test').has('p').addClass('red'); 
+0

Это здорово, как я могу сделать обратное, то есть «не имеет»? спасибо – SparrwHawk

+2

Нравится это, например: '$ ('. test: not (: has (p))')' –

+0

Brilliant, вы получили голосование, потому что объяснили, почему это не сработало :-) Спасибо! – SparrwHawk

3
if (!($(this).find('p').length > 0)) { 
    $(this).addClass('red'); 
} 
0

Вы можете использовать следующее условие для проверки отсутствия типа элемента:

if($('p', $(this)).length == 0) 

С $('p', $(this)) будет возвращать все p элементов внутри тока элемент.

2

Рассмотрим, используя следующие:

$("div.test:has(p)").addClass("red"); 

Это запрашивает ваш DOM для <div> элементов, выбирая только те, у кого есть тест test, а затем смотрит, есть ли у него элемент <p/>. Его бит более короткий = меньше байтов, проходящих по проводу.

Смежные вопросы