Зависимые списки и комментарии к каждому пункту из списка
Есть простой код, где при выборе элемента выпадающего списка создается комментарий , и в скрипте есть зависимые подсписки. Мне необходимо, что бы каждому элементу основного списка было по два комментария с выводом в разные места, и к зависимому списку который формирует JS тоже необходимо по два комментария и вывод в другие области. Если с основным списком еще более менее понятно, то вот с зависимым есть сложность, как ему задать разные комментарии для разных "Подэлементов".
<label for="list1">Список 1:</label>
<select id="list1" onchange="populateList2()">
<option value="">--- Выберите ---</option>
<option value="item1" data-comment="Комментарий к элементу 1">Элемент 1</option>
<option value="item2" data-comment="Комментарий к элементу 2">Элемент 2</option>
<option value="item3" data-comment="Комментарий к элементу 3">Элемент 3</option>
</select>
<label for="list2">Список 2:</label>
<select id="list2">
<option value="">--- Выберите ---</option>
</select>
<p id="comment"></p>
Скрипт
const list1 = document.getElementById("list1");
const list2 = document.getElementById("list2");
const comment = document.getElementById("comment");
const list1Values = {
item1: {options: ["Подэлемент 1.1", "Подэлемент 1.2", "Подэлемент 1.3"], comment: "Комментарий к элементу 1"},
item2: {options: ["Подэлемент 2.1", "Подэлемент 2.2"], comment: "Комментарий к элементу 2"},
item3: {options: ["Подэлемент 3.1", "Подэлемент 3.2", "Подэлемент 3.3", "Подэлемент 3.4"], comment: "Комментарий к элементу 3"}
};
function populateList2() {
const selectedValue = list1.value;
const optionHTML = list1Values[selectedValue].options.map(value => `<option value="${value}">${value}</option>`).join("");
list2.innerHTML = `<option value="">--- Выберите ---</option>${optionHTML}`;
comment.innerText = list1Values[selectedValue].comment;
}
populateList2();
Ответы (1 шт):
Автор решения: Talleyran
→ Ссылка
Как-то так:
//кладём все опции в объект
const allOptions = {
item1: {
title: "Элемент 1",
comment: "Коммент 1",
options: {
subitem1: {
title: "Зависимый 1",
comment: "Коммент 1-1"
},
subitem2: {
title: "Зависимый 2",
comment: "Коммент 1-2"
}
}
},
item2: {
title: "Элемент 2",
comment: "2",
options: {
subitem3: {
title: "Зависимый 3",
comment: "Коммент 2-3"
},
subitem4: {
title: "Зависимый 4",
comment: "Коммент 2-4"
}
}
}
};
const select1 = document.querySelector("#select1");
const select2 = document.querySelector("#select2");
const comment1 = document.querySelector("#comment1");
const comment2 = document.querySelector("#comment2");
//заполняем первый список
for (let option in allOptions) {
select1.options.add(new Option(allOptions[option].title, option));
}
//при изменении перого спаиска
select1.addEventListener("change", (event) => {
//чистим второй список
select2.length = 1;
select2.value = "";
comment2.innerText = "";
//заполянем второй список
let subOptions = allOptions[event.target.value].options;
for (let option in subOptions) {
select2.options.add(new Option(subOptions[option].title, option));
}
comment1.innerText = allOptions[event.target.value].comment;
});
//при изменении второго списка
select2.addEventListener("change", (event) => {
comment2.innerText = allOptions[select1.value].options[event.target.value].comment;
});
<select name="" id="select1">
<option value="" disabled selected>Выберите что-нибудь...</option>
</select>
<p id="comment1"></p>
<select name="" id="select2">
<option value="" disabled selected>Выберите еще что-нибудь...</option>
</select>
<p id="comment2"></p>