Я работал над функцией фильтра в jQuery для простого неупорядоченного списка. Каждый список находится внутри блока с фильтром, который можно изменить в серверной части (Wordpress), чтобы отфильтровать определенные строки. Фильтр также имеет кнопку сброса, чтобы вернуть его в исходное состояние.
Теперь меня попросили сделать этот список повторяемым. Само по себе повторение списка не было проблемой, но теперь фильтр отфильтровывает элементы во всех существующих списках.
Таким образом, фильтр работает, но он становится немного перевозбужденным, отфильтровывая все элементы с классом filter-list_item. Я думал, что добавление числа к классу в родительском div в каждом цикле, а затем добавление цикла for в jQuery для нацеливания на эти конкретные классы исправит это. Следовательно, переменные $list_count и listCount. Однако это делает то же самое и по-прежнему влияет на все списки. Не знаю почему. Любая помощь о том, как сделать так, чтобы фильтры отфильтровывали только элементы в своих соответствующих списках, была бы очень принята.
Это текущий jQuery для функции фильтра:
$(document).ready(function (){
// Content filter
var lists = $(".filter-list").length;
for(var listCount = 0; listCount < lists; ) {
$(".filter-list-"+listCount).find(".content-filter").change(function() {
// Retrieve the option value and reset the count to zero
var search = $(this).val(), count = 0;
$(".filter-list_item").each(function(){
// Remove item if it does not match the value
var string = this.innerText;
var found = strSearch(search.toLowerCase(), string.toLowerCase());
if (found) {
$(this).css("display", "block");
// Show the list item if the value matches and increase the count by 1
count++;
} else {
$(this).css("display", "none");
}
// Show reset button
if ($(this).index() > 0) {
$(".filter-reset").addClass("active");
}
});
// Update the count
if (count == 0) {
$(".filter-select-results").text("No results for " +search);
} else if (count > 0) {
$(".filter-select-results").text('');
}
});
// Reset filter
$(".filter-reset").click(function() {
$(".content-filter").prop('selectedIndex',0);
$(".filter-list_item").css("display", "block");
$(".filter-reset").removeClass("active");
$(".filter-select-results").text('');
});
listCount++;
}
});
// Search function
function strSearch(search, string) {
var n = string.search(search);
if (n >= 0) {
return true;
}
return false;
}
И это PHP, который используется для построения списков
<?php
$list_count = 0;
foreach ($layout['list'] as $list) { ?>
<div class = "container filter-list filter-list-<?php echo $list_count++; ?>">
<div class = "title-wrapper">
<h2><?php echo $list['title']; ?></h2>
<?php echo $list['description'];
// Content filter
if ($list['content_filter'] == true) { ?>
<div class = "filter-container">
<button class = "filter-reset"><i class = "fa-icon fa fa-undo"></i></button>
<select class = "content-filter" name = "filterselect">
<option value = "all" disabled selected>Selecteer een locatie</option>
<?php foreach($list['filter_options'] as $filter) { ?>
<option value = "<?php echo $filter['option']; ?>"><?php echo $filter['option']; ?></option>
<?php } ?>
</select>
</div>
<?php } ?>
</div>
<div class = "filter-select-results"></div>
<ul class = "filter-list_items">
<?php foreach($list['list_items'] as $list_item) { ?>
<?php if ( $list_item['link'] ) { ?>
<li class = "filter-list_item"><a href = "<?php echo $list_item['link']; ?>" class = "<?php echo $filterClass ?>"><?php echo $list_item['item']; ?></a></li>
<?php } else { ?>
<li class = "filter-list_item">
<span><?php echo $list_item['item']; ?></span>
</li>
<?php } ?>
<?php } ?>
</ul>
</div>
<div class = "container filter-list filter-list-<?php echo $list_count++; ?>"> создает уникальные классы для каждого filter-list, добавляя 1 (+1) к каждому циклу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Заменить $(".filter-list_item").each(function(){ на $(this).closest(".filter-list").find(".filter-list_item").each(function(){
Предполагается, что элемент .content-filter является частью .filter-list. closest затем переходит к первому родителю, удовлетворяющему условию. Выполняется ли это условие, немного неясно из показанного вами PHP-кода.
Я попытался сделать его кратким и показать только соответствующий код, но заметил, что забыл добавить фильтр в php, извините. Я добавил часть, где создается фильтр, в файл php. Я посмотрю, работает ли то, что вы предлагаете. Может быть!
Да, вы исправили это $(this).closest(".filter-list").find(".filter-list_item").each(function(){ сделал свое дело, спасибо!
Где создается HTML для
$(".filter-list-"+listCount)? Я думаю, вам нужно изменить$(".filter-list_item").each(function(){, чтобы он работал только с этими подсписками.