• Событие Change нужно сделать зависимые списки, и при выборе последнего должна выдаваться разная цена, как это сделать?

    @lolzqq
    HTML,CSS,JS,PHP
    Не знаю, должна ли быть связь между кол-вом комнат и площадью, при выборе именно площади - стоимости выдаёт разные, соответственно придуманным мной тарифам. Количество комнат в этом примере не учитывается.

    Код закомментировал, где в него влез и что-то переписал/добавил
    <!doctype html>
    <html lang="ru">
    <head>
      <meta charset="utf-8" />
      <title></title>
    
    </head>
    
    <body>
    <div class="select-locations select">
       <label for="location" class="location-label">Расположение</label>
    	<select class="select-street select-location" name="select-street" id="select-street" required>
    		<option value="sunny" selected="selected">ул.Солнечная</option>
    		<option value="kobceva">ул.Кобцева</option>
    		<option value="gagarina">ул.Гагарина</option>
    	</select>
    </div>
    <br>
    <div class="amount select area" id="input-select">
    	<label for="amount">Количество комнат</label>
    		<select class="select-room select-layout" name="select-room" id="select-room" required>
    			<option value="1">1</option>
    			<option value="2">2</option>
    			<option value="3">3</option>
    		</select>                       
    </div>
    <div class="layout-flat select">
    	<label for="layout">Общая площадь</label>
    	<select class="select-area area-block" name="select-area2" id="select-area" required>
    		
    	</select>
    <h3 class="last-price select">Цена <span class="price"></span></h3>
    </body>
    <script>
    function selectStreet(room,rooms){
      room.innerHTML = "";
      var c = this.value || "sunny", o;
      for(let i = 0; i < rooms[c].length; i++){
        o = new Option(rooms[c][i],i,false,false);
        room.add(o);
      };
    }
    function selectRoom(area,areas){
      area.innerHTML = "";
      var c = this.value || 1, o;
      for(let i = 0; i < areas[c].length; i++){
    	  // эту строчку модернизировал, чтобы в атрибут value выводилась площадь квартиры
        o = new Option(areas[c][i],areas[c][i],false,false); 
        area.add(o);
      };
    }
    function showPrice(tariffs,street,area){
    	// модифицировал вашу функцию
    	const selectElement = document.querySelector('.select-area');
    	
    	
    	selectElement.addEventListener('change', (event) => {
    		var street_option=street.value; // получаем значение улицы
    		var area_option=area.value; // получаем площадь квартиры
    		var tariff=tariffs[street_option]; // выбираем тариф
    		var cost=area_option*tariff; // перемножаем площадь квартиры на тариф
    	  
    	  const result = document.querySelector('.price');
    	  // вставляем вычисленную цену в '.price'
    	  result.textContent = cost;
    	});	
    }
    
    document.addEventListener("DOMContentLoaded", function(){
    	var	rooms = {
    	  sunny: ["1", "2", "3"],
    	  kobceva: ["1", "2", "3"],
    	  gagarina: ["1", "2"]
    	};
    	var	areas = {
    	  1: ["41.27", "46.96", "48.31"],
    	  2: ["68.33", "69.64", "70.97", "72.39"],
    	  3: ["67.31", "67.60","86.23", "94.54"]
    	};
    	// поскольку вы не указали, какой будет алгоритм расчёта цен,
    	// я решил, что это будут тарифы, зависящие от улицы
            // при желании, можете усложнить структуру и прописать свою цену для каждого набора квартир
            // тогда и в функции showPrice() нужно будет побольше факторов учитывать
            // в строке var tariff=tariffs[street_option]; // выбираем тариф - навигация будет иметь больше [ ] скобок
    	var tariffs = {
    		sunny: 100, // для улицы sunny квадратный метр стоит 100 ед.
    		kobceva: 200, // для улицы kobceva квадратный метр стоит 200 ед.
    		gagarina: 300 // для улицы gagarina квадратный метр стоит 300 ед.
    	}
    	var	street = document.getElementById("select-street");
    	var	room = document.querySelector("#select-room");
    	var	area = document.querySelector("#select-area");
    	selectStreet(room,rooms);
    	selectRoom(area,areas);
    	
    	street.addEventListener('change',selectStreet(room,rooms))
    	room.addEventListener('change',selectRoom(area,areas))
    	
    	showPrice(tariffs,street,area);
    
    	
    })
    
    </script>
    </html>
    Ответ написан
    3 комментария