#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;
});
Вы можете расширить фильтр на более сложные запросы.