У меня есть следующий div, который содержит список выбора тегов (категорий), которые при выборе фильтруют (скрывают) любые li, содержащие выбранное слово. Это работает хорошо, однако мне бы хотелось, чтобы родительский объект был скрыт.
Например, если была выбрана неврология, я бы хотел, чтобы заголовок 2 и его родительский ul все еще были видны вместе с неврологией. Если выбран диабет, я бы хотел, чтобы родительский ul был полностью скрыт.
Может кто-нибудь помочь с этим?
HTML
<div id = "container">
<select id = "tags">
<option>Cancer</option>
<option>Diabetes</option>
<option>Obesity</option>
</select>
<ul class = "itemdetails">
<li class = "heading">Heading 1</li>
<li><a href><span class = "tagdetails">Diabetes</span></a></li>
</ul>
<ul class = "itemdetails">
<li class = "heading">Heading 2</li>
<li><a href><span class = "tagdetails">Obesity</span></a></li>
<li><a href><span class = "tagdetails">Neurology</span></a></li>
</ul>
</div>
Jquery
var itemlist = $('#container');
$('#tags').change( function () {
var tagsfilter = $(this).val();
if (tagsfilter) {
$matches = $(itemlist).find('span.tagdetails:Contains(' + tagsfilter + ')').parent();
$('a', itemlist).not($matches).hide();
$matches.show();
} else {
$(itemlist).find("a").show();
}
return false;
})
Также в качестве примечания; itemlist уже является объектом jQuery, так что не делайте $(itemlist) и не пытайтесь перепаковать его, так как это бессмысленно. А $('a', itemlist) должно быть просто itemlist.find('a')

обновленный код.
1) $('.tagdetails:not(:contains("'+tagsfilter +'"))').closest('li').hide();
Сначала мы выбираем и скрываем все элементы li, которые не содержат текста значения выбранного параметра.
2) $('.itemdetails:not(:has(li:visible>a>span))').not('.heading').hide();
Затем мы выбираем все элементы ul с деталями класса, у которых есть видимый li дочерний элемент, который, в свою очередь, имеет потомков a и span и не имеет класса заголовка, и скрываем его.
$('#tags').change( function () {
$('.itemdetails').show();
$('.tagdetails').closest('li').show();
var tagsfilter = $(this).val();
if ($('.tagdetails:contains("'+tagsfilter+'")').length > 0){
$('.tagdetails:not(:contains("'+tagsfilter +'"))').closest('li').hide();
$('.itemdetails:not(:has(li:visible>a>span))').not('.heading').hide();
}
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "container">
<select id = "tags">
<option>Cancer</option>
<option>Diabetes</option>
<option>Obesity</option>
<option>Others</option>
</select>
<ul class = "itemdetails">
<li class = "heading">Heading 1</li>
<li><a href><span class = "tagdetails">Diabetes</span></a></li>
</ul>
<ul class = "itemdetails">
<li class = "heading">Heading 2</li>
<li><a href><span class = "tagdetails">Obesity</span></a></li>
<li><a href><span class = "tagdetails">Neurology</span></a></li>
</ul>
<ul class = "itemdetails">
<li class = "heading">Heading 3</li>
<li><a href><span class = "tagdetails">Diabetes</span></a></li>
<li><a href><span class = "tagdetails">Others</span></a></li>
</ul>
</div>Это работает фантастически, однако я заметил, что если Диабет также фигурирует, скажем, в Заголовке 3, он не показывает ни одного из них.
Для обработки этого случая код потребует sm-изменений. Я постараюсь обновить решение в ближайшее время.
Код был обновлен для выбора и отображения повторяющихся значений под разными заголовками. Надеюсь, это поможет.
Это абсолютно идеально. Работает как шарм. Большое спасибо за то, что уделили этому время.
Что ж, немедленный красный флаг
'span.tagdetails:Contains('должен быть в нижнем регистре