Кто-нибудь знает, как сделать это для опции вместо кнопки?
Сценарий должен фильтровать раздел 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\>
1. Вызов filterSelection
перед его определением вызовет ошибку. 2. Что со всеми экранирующими символами? 3. Пожалуйста, обновите свой вопрос snippet
и расскажите нам, как он должен вести себя более подробно.
Не используйте обработчик click
для опций, которые плохо поддерживаются браузерами. Вместо этого используйте обработчик change
для самого элемента select.
Использование имен переменных, таких как x,c,arr1,arr2, делает код очень трудным для понимания. Если вы можете добавить более осмысленные имена и строки комментариев, у нас больше шансов помочь.
В основном это код здесь w3schools.com/howto/… он просто не работает с тегами параметров
Я отредактировал код так, что какой бы год ни выбрал пользователь, элемент 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>
Это работает, единственное, чего не хватает, так это того, что по умолчанию он показывает их все.
В начальном состоянии он ничего не показывает, можете ли вы проверить его, щелкнув фрагмент кода запуска в моем ответе?
Фильтрация работает отлично. Но в исходном состоянии он должен показывать все элементы. После выбора года они должны быть отфильтрованы
Я отредактировал это так, как вы хотели, вы можете проверить это еще раз?
Пожалуйста, исправьте большую кучу лишних
\
символов, которые оказались в вашем коде, и преобразуйте его в живую демонстрацию.