Вы можете достичь этого, используя объект для хранения значений и связанных с ними выпадающих описаний.Чтобы сделать это, вам сначала нужно добавить eventListener
к вашему раскрывающемуся списку, чтобы он обнаруживал изменения при выборе нового фрукта.Используя этот прослушиватель событий, вы можете получить значение опции, которая была выбрана с помощью this.value
.
Используя value
из выбранной опции, вы можете перейти к получению связанных раскрывающихся значений от объекта, называемого prices
(это вернет массив).Получив этот массив, вы можете пройти по нему и «построить» строку HTML, используя .reduce()
для размещения в качестве параметров для тега price
select.Создав эту строку, вы можете добавить ее в тег select, используя .innerHTML
, который «преобразует» вашу строку HTML в объекты DOM (реальные элементы, а не просто текст):
let prices = {"apple":[{value:3,desc:"Apple 1kg 3€"},{value:5,desc:"Apple 2kg 5€"},{value:7,desc:"Apple 3kg 7€"}],
"banana":[{value:3,desc:"Banana 2kg 3.5€"},{value:5,desc:"Banana 4kg 7€"},{value:7,desc:"Banana 5kg 11€"}],
"peach":[{value:3,desc:"Peach 1.5kg 3€"},{value:5,desc:"Peach 3kg 6€"},{value:7,desc:"Peach 4kg 7€"}]}
document.getElementsByName('fruit')[0].addEventListener('change', function(e) {
document.getElementsByName('price')[0].innerHTML = prices[this.value].reduce((acc, elem) => `${acc}<option value="${elem.value}">${elem.desc}</option>`, "");
});
<select name="fruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="peach">Peach</option>
</select>
<br />
<select name="price">
<option value="3">Apple 1kg 3€</option>
<option value="5">Apple 2kg 5€</option>
<option value="7">Apple 3kg 7€</option>
</select>
Если вам неудобно использовать .reduce()
, вместо этого вы можете использовать обычный цикл for:
document.getElementsByName('fruit')[0].addEventListener('change', function(e) {
let options = "";
for(obj of prices[this.value]) {
options += '<option value="' +obj.value +'">' +obj.desc +'</option>';
}
document.getElementsByName('price')[0].innerHTML = options;
});