HTML-фильтр с тегом Option

Кто-нибудь знает, как сделать это для опции вместо кнопки? Сценарий должен фильтровать раздел HTML. Моя проблема в том, что, по-видимому, это не работает с <option> вместо <button>. В результате ничего не показывает мне вместо всего класса.

CSS

.show {
  display: block;
}
.filterDiv {
  display: none;
}

Это раздел фильтров. По умолчанию он должен быть установлен на всех

<div class = "col-lg-6 col-sm-6 col-12" id = "myBtnContainer">
    <div class = "release-filter justify-content-end d-flex">
            <div class = "filter-title">
                <select name = "year">
                    <option class = "btn active" value = "" onclick = "filterSelection('all')" disabled selected>Filter By Year</option>
                    <option class = "btn" value = "2023" onclick = "filterSelection('2023')">2023</option>
                    <option class = "btn" value = "2022" onclick = "filterSelection('2022')">2022</option>
                    <option class = "btn" value = "2021" onclick = "filterSelection('2021')">2021</option>
                    <option class = "btn" value = "2020" onclick = "filterSelection('2020')">2020</option>
                  </select>
            </div>
    </div>
</div>

Это один из пунктов, который следует отфильтровать. Но, как было сказано выше, это не работает. Он просто ничего не фильтрует и ничего мне не показывает.

<div class = "col-xl-6 col-lg-6 col-12 filterDiv 2023">
    <div class = "collection-release">
    </div>
</div>

JS

filterSelection("all")
function filterSelection(c) {
  var x, i;
  x = document.getElementsByClassName("filterDiv");
  if (c == "all") c = "";
  // Add the "show" class (display:block) to the filtered elements, and remove the "show" class from the elements that are not selected
  for (i = 0; i < x.length; i++) {
    w3RemoveClass(x[i], "show");
    if (x[i].className.indexOf(c) > -1) w3AddClass(x[i], "show");
  }
}

// Show filtered elements
function w3AddClass(element, name) {
   var i, arr1, arr2;
   arr1 = element.className.split(" ");
   arr2 = name.split(" ");
   for (i = 0; i \< arr2.length; i++) {
      if (arr1.indexOf(arr2\[i\]) == -1) {
         element.className += " " + arr2\[i\];
      }
   }
}

// Hide elements that are not selected
function w3RemoveClass(element, name) {
   var i, arr1, arr2;
   arr1 = element.className.split(" ");
   arr2 = name.split(" ");
   for (i = 0; i \< arr2.length; i++) {
      while (arr1.indexOf(arr2\[i\]) \> -1) {
         arr1.splice(arr1.indexOf(arr2\[i\]), 1);
      }
   }
   element.className = arr1.join(" ");
}

// Add active class to the current control button (highlight it)
var btnContainer = document.getElementById("myBtnContainer");
var btns = btnContainer.getElementsByClassName("btn");
for (var i = 0; i \< btns.length; i++) {
   btns\[i\].addEventListener("click", function() {
   var current = document.getElementsByClassName("active");
   current\[0\].className = current\[0\].className.replace(" active", "");
   this.className += " active";
   });
}
\</script\>

Пожалуйста, исправьте большую кучу лишних \ символов, которые оказались в вашем коде, и преобразуйте его в живую демонстрацию.

Quentin 11.04.2023 12:59

1. Вызов filterSelection перед его определением вызовет ошибку. 2. Что со всеми экранирующими символами? 3. Пожалуйста, обновите свой вопрос snippet и расскажите нам, как он должен вести себя более подробно.

Dimitar 11.04.2023 13:09

Не используйте обработчик click для опций, которые плохо поддерживаются браузерами. Вместо этого используйте обработчик change для самого элемента select.

CBroe 11.04.2023 13:22

Использование имен переменных, таких как x,c,arr1,arr2, делает код очень трудным для понимания. Если вы можете добавить более осмысленные имена и строки комментариев, у нас больше шансов помочь.

MrAlbino 11.04.2023 13:22

В основном это код здесь w3schools.com/howto/… он просто не работает с тегами параметров

Sotschi 11.04.2023 13:28
Поведение ключевого слова "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) для оценки ваших знаний,...
3
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

var mySelect = document.getElementById('yearSelect');
 mySelect.onchange = (event) => { //catch select option changes.
     var inputText = event.target.value; // get selected option value.

  var x, i;
  x = document.getElementsByClassName("filterDiv");
  if (inputText == "all") inputText = "";
  // Add the "show" class (display:block) to the filtered elements, and remove the "show" class from the elements that are not selected
  for (i = 0; i < x.length; i++) {
    w3RemoveClass(x[i], "show");
    if (x[i].classList.contains(inputText)) w3AddClass(x[i], "show");
  }
}

// Show filtered elements
function w3AddClass(element, name) {
     element.classList.add(name);
}

// Hide elements that are not selected
function w3RemoveClass(element, name) {
   element.classList.remove(name);
}

// Add active class to the current control button (highlight it)
var btnContainer = document.getElementById("myBtnContainer");
var btns = btnContainer.getElementsByClassName("btn");
for (var i = 0; i < btns.length; i++) {
   btns[i].addEventListener("click", function() {
   var current = document.getElementsByClassName("active");
   current[0].className = current[0].className.replace(" active", "");
   this.className += " active";
   });
}
.show {
  display: block !important; 
}
.filterDiv {
  display: none;
}
<div class = "col-lg-6 col-sm-6 col-12" id = "myBtnContainer">
    <div class = "release-filter justify-content-end d-flex">
            <div class = "filter-title">
                <select name = "year" id = "yearSelect">
                    <option class = "btn active" value = "" onclick = "filterSelection('all')" disabled selected>Filter By Year</option>
                    <option class = "btn" value = "2023">2023</option>
                    <option class = "btn" value = "2022">2022</option>
                    <option class = "btn" value = "2021">2021</option>
                    <option class = "btn" value = "2020">2020</option>
                  </select>
            </div>
    </div>
</div>


<div class = "col-xl-6 col-lg-6 col-12 show filterDiv 2023">
    <div class = "collection-release">
    2023 filter div
    </div>
</div>
<div class = "col-xl-6 col-lg-6 col-12 show filterDiv 2022">
    <div class = "collection-release">
    2022 filter div
    </div>
</div>
<div class = "col-xl-6 col-lg-6 col-12 show filterDiv 2021">
    <div class = "collection-release">
    2021 filter div
    </div>
</div>
<div class = "col-xl-6 col-lg-6 col-12 show filterDiv 2020">
    <div class = "collection-release">
    2020 filter div
    </div>
</div>

Это работает, единственное, чего не хватает, так это того, что по умолчанию он показывает их все.

Sotschi 11.04.2023 13:55

В начальном состоянии он ничего не показывает, можете ли вы проверить его, щелкнув фрагмент кода запуска в моем ответе?

MrAlbino 11.04.2023 14:07

Фильтрация работает отлично. Но в исходном состоянии он должен показывать все элементы. После выбора года они должны быть отфильтрованы

Sotschi 11.04.2023 14:09

Я отредактировал это так, как вы хотели, вы можете проверить это еще раз?

MrAlbino 11.04.2023 14:12

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