Выберите элемент (ы) без определенного элемента

#javascript #jquery

#javascript #jquery

Вопрос:

Привет, это моя проблема:

 <ul>
   <li><span class="show">*</span>Show</li>
   <li><span class="show">*</span>Show</li>
   <li><span class="show">*</span>Show</li>
   <li><span class="show">*</span>Show</li>
   <li>Hide</li>
   <li>Hide</li>
</ul>
  

Так что против этого http://jsfiddle.net/ajitam/GqCpW /

Как я могу выбрать (с помощью jQuery) ‘li’ без span.показать внутри.

Спасибо

Ответ №1:

Селектор должен выглядеть следующим образом:

 $('ul li:not(:has(span.show))')
  

Пример: http://jsfiddle.net/Mkj7Z /

Поскольку такой селектор довольно дорогой, убедитесь, что вы кэшируете результирующие узлы DOM в переменной для дальнейшего доступа.

Ответ №2:

Попробуйте скрыть все, а затем показать те, которые имеют span.show

 $('ul li').hide().find('span.show').parent().show();
  

Комментарии:

1. Да, это один из способов, но я должен использовать slideToggle, поэтому об этом методе не может быть и речи

Ответ №3:

Решение $('ul li:not(:has(span.show))') jAndy работает хорошо, но :not , :has как правило, плохо выполняет селекторы (и он указывает, что они дорогие). Глядя на вашу разметку, можно ли выбирать <li> элементы на основе их текста?

 // Using `:contains` we can look for *Hide*
$('ul > li:contains("Hide")')

// Or using `filter()` for an exact match
$('ul > li').filter(function () {
    return $.text(this) === "Hide";
});
  

Это немного быстрее и немного аккуратнее.

Ответ №4:

Используйте:

 $('ul li').filter(function(){
     return $('.show',this).length==0;
});
  

Вы можете расширить фильтр на более сложные запросы.