Как сделать автономную повторяющуюся функцию jQuery

Я работал над функцией фильтра в 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>

Где создается HTML для $(".filter-list-"+listCount)? Я думаю, вам нужно изменить $(".filter-list_item").each(function(){, чтобы он работал только с этими подсписками.

Adder 08.11.2018 14:57
<div class = "container filter-list filter-list-<?php echo $list_count++; ?>"> создает уникальные классы для каждого filter-list, добавляя 1 (+1) к каждому циклу.
Marrrc 08.11.2018 16:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Заменить $(".filter-list_item").each(function(){ на $(this).closest(".filter-list").find(".filter-list_item").each(function(){

Предполагается, что элемент .content-filter является частью .filter-list. closest затем переходит к первому родителю, удовлетворяющему условию. Выполняется ли это условие, немного неясно из показанного вами PHP-кода.

Я попытался сделать его кратким и показать только соответствующий код, но заметил, что забыл добавить фильтр в php, извините. Я добавил часть, где создается фильтр, в файл php. Я посмотрю, работает ли то, что вы предлагаете. Может быть!

Marrrc 08.11.2018 16:04

Да, вы исправили это $(this).closest(".filter-list").find(".filter-list_item").ea‌​ch(function(){ сделал свое дело, спасибо!

Marrrc 08.11.2018 16:20

Другие вопросы по теме