Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Калькулятор с вариантом значений. (https://javascript.ru/forum/misc/65063-kalkulyator-s-variantom-znachenijj.html)

dzho 23.09.2016 01:57

Калькулятор с вариантом значений.
 
Всем привет. Только осваиваюсь в js так что прошу поддержки как разобраться с этим.

1. Дана форма
2. При выборе select и checkbox в input подставлялись значения
( как поставить их не могу определиться или в input hidden или через массивы );

3. От первого значение select зависит второй select также checkbox
Например:

Выбираю из первого select>option с названием "productOne" его значение заноситься в привязанный к нему input ( например цена 50 руб )

От выбора первого select>option зависит последующие input.
т.е productTwo зависит от первого select>option "productOne"

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Training JavaScript</title>
</head>
<body>

<!-- select product -->

<select id="view">
<option  selected 	id = "option">Выбрать</option>
<option  id = "optionOne">product</option>
<option  id = "optionTwo">productTwo</option>
<option  id = "optionFour">productThree</option>
</select>
<br>
<br>
<!-- color product -->

<select  id="viewOne">
<option value="red">colorRed</option>
<option value="blue">colorBlue</option>
</select>

<br>
<br>

<!-- checkbox list  -->

<input type="checkbox" id="list">

<br>
<!-- Здесь значение меняються от выбранных вариантов -->

<!-- size product -->

<input type="text" id = "rez" placeholder="0 руб"> <!-- зависимость от первого select -->
<br>
<br>
<input type="text" id = "rezOne" placeholder="0 руб"> <!-- зависимость от второго select -->
<br>
<br>
<input type="text" id = "rezTwo" placeholder="0 руб"> <!-- зависимость от checkbox -->
<br>
<br>

<input type="text" id="summa" placeholder="Сумма">

<script src="common.js"></script>

</body>
</html>

laimas 23.09.2016 02:33

Ничего не понятно. Что за что отвечает? Если список задает цену при выборе в нем, то зачем input, ведь в нем можно цену и изменить? Если цена вводится в поле, то что означает выбор в списке?

dzho 24.09.2016 09:42



Посмотрите пожалуйста нарисовал схемку как выглядит таблица

dzho 24.09.2016 09:47

если выбираешь в первом селекте чайник1, то цена меняется в остальных. Если выбираешь чайник 2 также значения меняются в остальных.

рони 24.09.2016 10:00

dzho,
обьект нужен со всеми вашими зависимостями

dzho 24.09.2016 10:25

Пожалуйста можете написать пример как это реализовать.

рони 24.09.2016 10:48

dzho,
сложность ваших зависимостей ,как вы их описали выше, возрастает в геометрической прогрессии, мне сложно такое просто для примера написать, а так ищите по форуму и в инете зависимые селекторы.

warren buffet 24.09.2016 14:07

Цитата:

Сообщение от dzho
то цена меняется в остальных.

Куда она меняется?

Цена = 50.

Если нажали кнопку, то

Цена = ?

Данные-то все у тебя. Бери и меняй.

Какая-то бредовая бизнес-логика к тому же.

dzho 24.09.2016 16:45

Ребята, написал демку, так как понял что я не понятно для Вас обьяснил.
https://jsfiddle.net/0aappu0v/

рони 24.09.2016 17:30

dzho,
ок!

dzho 24.09.2016 17:47

рони, это не намек на что вот демка возьмите и сделайте, просто прошу помощи как её реализовать.

warren buffet 24.09.2016 18:03

Не так все делается. Сперва надо спроектировать структуру данных, где все барахло будет лежать.

dzho 24.09.2016 18:17

т.е значения в обьектах не хранить или есть другой вариант?

рони 24.09.2016 18:20

dzho,
в одном обьекте структуру дерево создать, и всё в форму тогда change только на форму

warren buffet 24.09.2016 18:21

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

Нужна таблица продуктов и таблица опций продуктов, минимально так:

Таблица Автомобили.
ID
Название

Таблица Цвет
ID
ProductID
Название цвета
Цена

Таблица Опции
ID
ProductID
Название опции
Цена

Технически так и делается, но ты мне покажи бизнес-логику. Как ты определишь цену на Мазда Красная Опция1, если у тебя в каждой блеать опции конечная цена продукта? Ты думал об этом, да, и придумал перевернуть все через жопу, то есть загнать все цвета и опции в запись продукта, то есть

Таблица Автомобили.
ID
Название
Название цвета 0 - Цена
Название цвета 1 - Цена
Название цвета 2 - Цена
Название опции 1 - Цена

Нифига не полегчало. Как ты выберешь Мазда Цвет 0 Опция 1, если выбрать можно только что-то одно? Нельзя же выбрать два цвета - красный и синий. Ну, технически можно, но это получится бред.

Чтобы выбрать Опцию дополнительно к цвету, придется ввести еще признак, показывающий, что эту опцию можно выбрать дополнительно к уже выбранным, поскольку цвет - такая опция как и любая другая, то есть одно из потребительских свойств продукта.

Твоя бредовая бизнес-логика и не дает тебе понять и реализовать этот бред. Делай нормально. Нормально это как выше. Цены за цвет и опции определяются как таковые, то есть как за отдельные товары, несмотря, что это опции. Это значит базовый цвет будет стоить 0, базовая опция - без которой нельзя продать машину, будет стоить 0. А все навороты - больше 0. Следовательно в продуктовой таблице цена за товар уже включает в себя базовую комплектацию и значит там есть цена

Таблица Автомобили.
ID
Название
Цена базовой комплектации

warren buffet 24.09.2016 18:26

Если машинки там чисто для примера, то действующее вещество твоего бреда вот где

Название
Название цвета 0 - Цена
Название цвета 1 - Цена
Название цвета 2 - Цена
Название опции 1 - Цена

Из такого списка можно выбрать только одну опцию, а у тебя задумка, выбирать из него цвет по одному и еще опцию эту дополнительно. Конечно ты можешь захардкодить бредовую логику прямо в скрипп, ну захардкодь.

рони 24.09.2016 18:54

зависимые селекты и сумма
 
:write:
вариант для медитации ... при условии product это начальная цена, всё остальное повышающие коэффициенты.

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .optionally:checked ~ .rez {
    display: inline;
  }
  .optionally ~ .rez {
    display: none;
  }
  </style>

</head>

<body>
<p>
Если Выбрал значения из первого select т.е mazda значения цен одни, а когда выбираешь например bmw<br>
то значения другие.
</p>
<form id="form" action="http://">


<!-- select product -->

<select  class="car">
<option  value="">Выбрать</option>
<option  value="mazda">mazda</option>
<option  value="lada">lada</option>
<option  value="bmw">bmw</option>
</select>
<br>
<br>
<!-- color product -->

<select  class="color">
<option value="">Выбрать</option>
<option value="red">Красный</option>
<option value="blue">Белый</option>
<option value="blue">Синий</option>
</select>

<br>
<br>

<!-- checkbox list  -->

<br>
<br>
<!-- Здесь значение меняються от выбранных вариантов -->

<!-- size product -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от первого select -->
<br>
<br>
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от второго select -->
<br>
<br>
<input type="checkbox" class="optionally" id="opt"><label for="opt">дополнительный настройки

</label>
<br>
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от checkbox -->

<br>

<label>Здесь суммируются значения котые выбрал пользователь</label><br>
<input type="text" class="summa" placeholder="Сумма">
</form>
<script>
window.addEventListener("DOMContentLoaded", function() {
    var d = {
            mazda: {
                product: 350,
                red: 450,
                white: 500,
                blue: 550,
                option: 360
            },
            lada: {
                product: 400,
                red: 600,
                white: 700,
                blue: 350,
                option: 660
            },
            bmw: {
                product: 600,
                red: 700,
                white: 300,
                blue: 340,
                option: 360
            }
        },
        f = document.querySelector("#form"),
        g = f.querySelector(".summa"),
        h = f.querySelectorAll(".rez"),
        a = f.querySelectorAll(".car, .color, #opt"),
        b;
    f.addEventListener("change", function() {
        var c = a[0].value;
        b = [0, 0, 0];
        if (c) {
            b[0] = d[c].product;
            var e = a[1].value;
            e && (b[1] = d[c][e]);
            a[2].checked && (b[2] = d[c].option)
        } else a[1].value = "";
        g.value = b.reduce(function(b, a, c) {
            h[c].value = a + " руб.";
            return b + a
        }, 0) + " руб."
    })
});
</script>



</body>
</html>

dzho 25.09.2016 00:39

Рони, спасибо это почти то что нужно:)
http://codepen.io/dzheysen/pen/amJYWJ на основе этого сделал превьюшку
но есть сложности как реализовать добавленный функционал

// Здесь проблема. Как сделать чтобы при выборе цвета была зависимость в значениях checkbox
// например пользователь выбрал значение 1.20 и значения меняются
// получаеться так если 1м.20см то значения c такой ценой

// option: 1500,
// optionTwo: 1400,
// optionThree: 2000,

// а если 1м.50см

// option: 2400,
// optionTwo: 0,
// optionThree: 0,
// optionFour: 0,
// optionFive: 0

рони 25.09.2016 00:57

dzho,
не понимаю вашего описания, будет дерево, будет код.

dzho 25.09.2016 02:41

<div class="block-form">

<form id="form" action="http://">
<h2>Наши услуги</h2>
  <div class="block-left">

<!-- Выбор услуги -->

<select  class="ListService">
<option  value="">Выбрать</option>
<option  value="Enamelling">Эмалировка</option>
<option  value="Starkril">Старкрил 2</option>
<option  value="liquidAcrylic">Жидкий акрил</option>
<option  value="AcrylicLiner">Акриловый вкладыш</option>
</select>
<br>
<!-- Длина ванны -->

<select  class="meters">
<option value="">Выбрать</option>
<option value="meterOne">1м.20 см</option>
<option value="meterTwo">1м.50 см</option>
<option value="meterThree">1м.70 см</option>
</select>
    
<!-- Опции услуг -->
  <label for="opt">
<input type="checkbox" class="optionally" id="opt"><p>Цвет ванны</p>
</label>   
    
 <label for="opt1">
<input type="checkbox" class="optionally" id="opt1"><p>Установка уголка</p>
</label>
    
<label for="opt2">
<input type="checkbox" class="optionally" id="opt2"><p>Установка сливной системы</p>
</label>  
    
 <label for="opt3">
<input type="checkbox" class="optionally" id="opt3"><p>Установка экрана под ванну</p>
</label>   
 
<label for="opt4">
<input type="checkbox" class="optionally" id="opt4"><p>Установка счетчиков.гор. холодной воды</p>
</label>  
    
    <label for="opt5">
<input type="checkbox" class="optionally" id="opt5"><p>Установка счетчиков.хол. горячей воды</p>
</label>         
    <h3>Итого</h3>
    
</div>

<div class="block-right">
<!-- checkbox list  -->

<!-- Здесь значение меняются от выбранных вариантов -->

<!-- size product -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от первого select -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от второго select -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> 

<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> 
  
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> 
  
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">  
  
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">  
  
<br>


<input type="text" class="summa" placeholder="Сумма">
</form>
  </div>
  </div>


window.addEventListener("DOMContentLoaded", function() {
    var d = {
            Enamelling: { // Эмалировка
                product: 1500,  // цена
                meterOne: 1400, // стоимость длины ванны 1.20
                meterTwo: 1500, // стоимость длины ванны 1.50
                meterThree: 1500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
            Starkril: { // Старкрил 2
              
                product: 2000, // цена
                meterOne: 1400, // стоимость длины ванны 1.20
                meterTwo: 1500, // стоимость длины ванны 1.50
                meterThree: 1500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
            liquidAcrylic: { // Жидкий акрил
                product: 3000, // цена
                meterOne: 1500, // стоимость длины ванны 1.20
                meterTwo: 2000, // стоимость длины ванны 1.50
                meterThree: 2500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
      
            AcrylicLiner: { // Акриловый вкладыш
                product: 1500, // цена
                meterOne: 1400,  // стоимость длины ванны 1.20
                meterTwo: 3000, // стоимость длины ванны 1.20
                meterThree: 3000, //стоимость длины ванны 1.70
                colorBath: 2000, // стоимость цвета заливки
                option: 2000, // checkbox установка уголка
                optionTwo: 0, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
        },
        f = document.querySelector("#form"),
        g = f.querySelector(".summa"),
        h = f.querySelectorAll(".rez"),
        a = f.querySelectorAll(".ListService, .meters, #opt", "#opt2", "#opt3","#opt4","#opt5"),
        b;
    f.addEventListener("change", function() {
        var c = a[0].value;
        b = [0, 0, 0, 0, 0 , 0, 0];
        if (c) {
            b[0] = d[c].product;
            var e = a[1].value;
            e && (b[1] = d[c][e]);
            a[2].checked && (b[2] = d[c].option )
        } else a[2].value = "";
        g.value = b.reduce(function(b, a, c) {
            h[c].value = a + " руб.";
            return b + a
        }, 0) + " руб."
    })
});


Сейчас не работает вызов опций начинаю от "Установка уголка" просмотрев Ваш код не совсем понял как подцепить эти их :)

Так же логика при выборе услуги " Старкрил2" получается пользователь выбирает эту услугу

размер ванны 1.20 то

изменяются значения опций

option: 1500, // checkbox установка уголка
optionTwo: 1400, // checkbox установка сливной системы
optionThree: 2000, // checkbox установка экрана под ванну

а если выбирает "Стакрил2" размер ванны 1.50

изменяются значения опций

option: 2400, // checkbox установка уголка
optionTwo: 0, // checkbox установка сливной системы
optionThree: 0, // checkbox установка экрана под ванну
optionFour: 0, // установка счетчиков гор.холодн.воды
optionFive: 0 // установка счетчиков хол. горячей воды


значения изменяются при выборе 1.70

colorBath: 0, // цвет ванны
option: 2400, // checkbox установка уголка
optionTwo: 0, // checkbox установка сливной системы
optionThree: 1000, // checkbox установка экрана под ванну
optionFour: 0, // установка счетчиков гор.холодн.воды
optionFive: 0 // установка счетчиков хол. горячей воды


Надеюсь расписал доходчиво:)

warren buffet 25.09.2016 07:36

Шизики блин развлекаются в порядке "не мешайте страдать". Когда-то я тоже не знал SQL, а про JSON не знал вообще, и ничтоже сумняще захерачил сайт с бд в файлах на XML'e. Вот как делается блин, если вы на русском не понимаете, то поймете на xml'ном

<cars>

	<car_params>
		<part id="1">Тип кузова / Цвет</part>
		<part id="2">Двигатель</part>
		<part id="3">Коробка передач</part>
		<part id="4">Тормоза</part>
		<part id="5">Топливо / Бак</part>	
		<part id="6">Расход топлива</part>
		<part id="7">Руль / Свет</part>
		<part id="8">Привод</part>
		<part id="9">Мультимедия</part>
		<part id="10">Интерьер</part>
	</car_params>
	
	<price_params>
		<price id="1">Прокат на 1 сутки с лимитом пробега в 250 км</price>
		<price id="2">Прокат на 1 сутки без лимита пробега</price>
		<price id="3">Тариф выходного дня с лимитом пробега в 250 км</price>
		<price id="4">Тариф выходного дня без лимита пробега</price>
		<price id="5">Переплата за каждый километр свыше лимита</price>
		<price id="6">Почасовая аренда автомобиля без водителя</price>
	</price_params>

	<car id ="Lancer15">
	
		<title>
			<manufacturer>Mitsubishi</manufacturer>
			<modelName>Lancer</modelName>
			<bodyName>X 1.5</bodyName>
		</title>

		<parts>
			<part id="1">Седан / Черный</part>
			<part id="2">Объем: 1.5 л. Мощность: 109 лс.</part>
			<part id="3">Автоматическая; вариатор с ручным режимом</part>
			<part id="4">Дисковые. ABS + EBD (система распределения тормозных усилий)</part>
			<part id="5">Неэтилированный бензин Аи-92 / 59 л.</part>
			<part id="6">Город: 8.9; Трасса: 6.0; Смешанный цикл: 7.0</part>
			<part id="7">Слева / Европейский + противотуманные фары</part>
			<part id="8">Передний</part>
			<part id="9">CD-MP3 ресивер, радио, 4 динамика</part>
			<part id="10">Концидионер, подогрев сидений, тканевая обивка, фильтр салона</part>
		</parts>

		<prices>
			<price id="1">3700</price>
			<price id="2">4200</price>
			<price id="3">11100</price>
			<price id="4">12600</price>
			<price id="5">5</price>
			<price id="6">500</price>
		</prices>
		
	</car>


<car_params> сущность (таблица) названий сущностей параметров для всех машин, и она связана с любой таблицей <car><parts> через атрибут id

<price_params> таблица названий услуг для всех машин и она связана с любой таблицей <car><prices> через атрибут id

То есть <car_params> и <price_params> существуют в единственном экземпляре, а <parts> и <params> существуют в любом количестве внутри сущности <car>, которых может быть любое количество.

Это называется нормализация. Без нормализации dzho ты будешь тонуть в гавнокоде при каждом чихе. А рони, он просто не понимает, что такое реляционная БД, а у тебя как раз реляционная БД на входе.

Развлекайтесь далее.

warren buffet 25.09.2016 07:51

Машинками надоело торговать, продаешь ванны? Ну какая разница. Сущности надо выяснять, а не говнокоды писать.

Enamelling: { // Галоперидол
	product: 1500,  // цена за какую длину?
	meterOne: 1400, // Где длина?
	meterTwo: 1500, // стоимость длины ванны 1.50 - где длина?
	meterThree: 1500, //стоимость длины ванны 1.70 - где длина?
	colorBath: 0, // А если из 20 оттенков 3 будут по другой цене?
	option: 1500, // и чем отличается установка уголка на чугун от пластика?
	optionTwo: 1400, // какое отношение эмалированная ванна
	optionThree: 2000, // имеет к сервису
	optionFour: 850, // установки счетчиков
	optionFive: 900 // и еще установки счетчиков ???
},


ржунимагу блин. Не будет так работать никогда.

warren buffet 25.09.2016 08:19

А теперь самое больное. У машинки есть базовая и опции, а у ванны нет опций, нельзя убрать цвет или покрытие, можно только выбрать из того, что производится. На json ванная опупея будет примерно такой

var params={

	Len:{
		1:1200,
		2:1500,
		3:1700,
	},

	Hue:{
		1:'Perl',
		2:'Pale',
		3:'Water',
		4:'Smoke'
	},

	Mat:{
		1:'Чугун',
		2:'Сталь',
		3:'Акрил'
	},

	Sur:{
		1:'Эмаль',
		2:'Гуашь',
		3:'Акрил'
	},

	Shp:{
		1:'Овальная',
		2:'Прямоугольная',
		3:'Трехуйгольная'
	}
},

products={

	'00007643':{
		id:'00007643',
		name:'Акриловая овальная ванна Даздраперма белого цвета длиной 1500 мм',
		len:2,
		mat:3,
		hue:1,
		sur:null,
		shp:1,
		price:10500
	},

	'00007644':{
		id:'00007644',
		name:'Чугунная ванна Заря трехуйгольной формы палевого цвета длиной 1700 мм',
		len:3,
		mat:3,
		hue:2,
		sur:1,
		shp:3,
		price:20500
	},
	
	'00007645':{
		id:'00007645',
		name:'Стальная прямоугольная ванна Иосиф дымчатого цвета длиной 1200 мм',
		len:1,
		mat:2,
		hue:4,
		sur:3,
		shp:1,
		price:15400
	},

};


Зачем тогда все эти шмопции, если ценник уже вписан в продукт и название целиком его описывает? Ну для фильтрации и быстрого поиска. Так вот имея такой нормализованный жисон, становится проще пареной репы приделать к нему интерфейс, поскольку уже все само самочевидно.

warren buffet 25.09.2016 08:28

А насчет опций оттенка скажем, с ними известный затык. Как ты продашь серый цвет без артикула? Как ты проведешь серый без артикула? Как отчитаешься за серый без артикула?

Любая опция порождает сущность - артикул товара. Либо ты продаешь не один товар, а комплект из более чем одного артикула. Всякие уголки и счетчики так и продаются - как список артикулов, как чек с итого.

Прекращайте мозг насиловать и займитесь уже делом. Лал.

рони 25.09.2016 08:30

dzho,
это не дерево, это грабли ...
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">


</head>

<body>
<div class="block-form">

<form id="form" action="http://">
<h2>Наши услуги</h2>
  <div class="block-left">

<!-- Выбор услуги -->

<select  class="ListService">
<option  value="">Выбрать</option>
<option  value="Enamelling">Эмалировка</option>
<option  value="Starkril">Старкрил 2</option>
<option  value="liquidAcrylic">Жидкий акрил</option>
<option  value="AcrylicLiner">Акриловый вкладыш</option>
</select>
<br>
<!-- Длина ванны -->

<select  class="meters">
<option value="">Выбрать</option>
<option value="meterOne">1м.20 см</option>
<option value="meterTwo">1м.50 см</option>
<option value="meterThree">1м.70 см</option>
</select>

<!-- Опции услуг -->
  <label for="opt">
<input type="checkbox" class="optionally" id="opt"><p>Цвет ванны</p>
</label>

 <label for="opt1">
<input type="checkbox" class="optionally" id="opt1"><p>Установка уголка</p>
</label>

<label for="opt2">
<input type="checkbox" class="optionally" id="opt2"><p>Установка сливной системы</p>
</label>

 <label for="opt3">
<input type="checkbox" class="optionally" id="opt3"><p>Установка экрана под ванну</p>
</label>

<label for="opt4">
<input type="checkbox" class="optionally" id="opt4"><p>Установка счетчиков.гор. холодной воды</p>
</label>

    <label for="opt5">
<input type="checkbox" class="optionally" id="opt5"><p>Установка счетчиков.хол. горячей воды</p>
</label>
    <h3>Итого</h3>

</div>

<div class="block-right">
<!-- checkbox list  -->

<!-- Здесь значение меняются от выбранных вариантов -->

<!-- size product -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от первого select -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от второго select -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<br>
</div>

<input type="text" class="summa" placeholder="Сумма">
</form>

  </div>

<script>
window.addEventListener("DOMContentLoaded", function() {
    var d = {
            Enamelling: { // Эмалировка
                product: 1500,  // цена
                meterOne: 1400, // стоимость длины ванны 1.20
                meterTwo: 1500, // стоимость длины ванны 1.50
                meterThree: 1500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
            Starkril: { // Старкрил 2

                product: 2000, // цена
                meterOne: 1400, // стоимость длины ванны 1.20
                meterTwo: 1500, // стоимость длины ванны 1.50
                meterThree: 1500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
            liquidAcrylic: { // Жидкий акрил
                product: 3000, // цена
                meterOne: 1500, // стоимость длины ванны 1.20
                meterTwo: 2000, // стоимость длины ванны 1.50
                meterThree: 2500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },

            AcrylicLiner: { // Акриловый вкладыш
                product: 1500, // цена
                meterOne: 1400,  // стоимость длины ванны 1.20
                meterTwo: 3000, // стоимость длины ванны 1.20
                meterThree: 3000, //стоимость длины ванны 1.70
                colorBath: 2000, // стоимость цвета заливки
                option: 2000, // checkbox установка уголка
                optionTwo: 0, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
        },
        f = document.querySelector("#form"),
        g = f.querySelector(".summa"),
        h = f.querySelectorAll(".rez"),
        a = f.querySelectorAll(".ListService, .meters, #opt,#opt1, #opt2, #opt3, #opt4,#opt5"),
        b,
        k = ["colorBath","option","optionTwo","optionThree","optionFour","optionFive"];
    f.addEventListener("change", function() {
        var c = a[0].value;
        b = [0, 0, 0, 0, 0 , 0, 0];
        if (c) {
            b[0] = d[c].product;
            var e = a[1].value;
            e && (b[1] = d[c][e]);
            k.forEach(function(el,i) {
       a[i+2].checked && (b[i+2] = d[c][el] )
});

        } else a[2].value = "";
        g.value = b.reduce(function(b, a, c) {
            h[c].value = a + " руб.";
            return b + a
        }, 0) + " руб."
    })
});

</script>



</body>
</html>

warren buffet 25.09.2016 09:24

Цитата:

Сообщение от рони
это не дерево, это грабли ...

Зайди на яндекс-маркет или на ламоду и убедись, что нет там никаких деревьев. На маркете все на xml и xsl шаблонах, а на любом нормальном ИМ в SQL'е ахиренная куча артикулов. Цвет кепки другой? - Другой артикул.

Только олени так делают, запихивают в продуктовую страницу двадцать других продуктов, а потом платят спаммерам за раскрутку, поскольку такое гавно невозможно проиндексировать нормально.

Ну а наш страдалец изобретает гавно из гавна.

warren buffet 25.09.2016 09:32

"Дерево" растет сугубо в навигационной таблице, которую можно и отрендерить как дерево, а каталог это всегда тупо листинг, список артикулов. И нафиг на ламоду не надо ходить, любые форумы так устроены. По id записи можно найти к какой теме она относится и к какой рубрике, вот так http://javascript.ru/forum/showthread.php?p=429718

warren buffet 25.09.2016 09:38

То есть адрес example.com/bath/197643-vanna-is-chugunia делается для красоты и по традиции, на самом деле он может быть таким example.com/197643 Никто в 21 веке не полезет в адресную строку стирать 197643-vanna-is-chugunia чтобы добраться до /bath Никто.

warren buffet 25.09.2016 09:40

Если хочешь дерево, то проектируй дерево, есть решения, но практика не выносит их на поверхность, потому что деревья оказались не нужны. Все делают в adjacent list и похеру на некоторую избыточность данных. Нормализация не культ.

warren buffet 25.09.2016 09:45

В туторах по реляционным бд излюбленная фактура гуру - музыка. Типа пот есть альбом, у него есть исполнитель, год и треки. Типа вот таблица треков, там есть ид альбома, у альбома есть ид исполнителя, все красиво. Все красиво, пока это попса, а если классика? Если Аллегро Лето Вивальди исполняли 100500 оркестров? Или если эту прокладку производят 100500 фабрик? Деревья - это прошлое, это файловая система. В сетях давно рулят долбаные графы.

dzho 25.09.2016 10:33

Warren buffet я считаю что данный метод подходит отлично для маленького обьема данных в таком виде что указал рони. Для различных сайт визиток, landing page. А реляционная база данных уже для более крупных проектов. Хотя использовать Jsom в данном случае также отличный вариант.

dzho 25.09.2016 11:06

рони спасибо огромное. Вопрос а как добавить условия при выборе услуги старкрил2

if (starkil == 1м.20см) { 
	option: 1500,	
	optionTwo: 1400,
	optionThree: 2000

}

if (starkil == 1м.40см) {

	option: 2400,
	optionTwo: 0,
	optionThree: 0,
	optionFour: 0,
	optionFive: 0
} 

if (starkil == 1м.70) {
	colorBath: 0,
	option: 2400,
	optionTwo: 0,
	optonThree: 1000,
	optionFour: 0,
	optionFive: 0
}

рони 25.09.2016 11:41

Цитата:

Сообщение от dzho
1м.40см

1м.50 см было

примерно так ... продолжение ... :cray:
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">


</head>

<body>
<div class="block-form">

<form id="form" action="http://">
<h2>Наши услуги</h2>
  <div class="block-left">

<!-- Выбор услуги -->

<select  class="ListService">
<option  value="">Выбрать</option>
<option  value="Enamelling">Эмалировка</option>
<option  value="Starkril">Старкрил 2</option>
<option  value="liquidAcrylic">Жидкий акрил</option>
<option  value="AcrylicLiner">Акриловый вкладыш</option>
</select>
<br>
<!-- Длина ванны -->

<select  class="meters">
<option value="">Выбрать</option>
<option value="meterOne">1м.20 см</option>
<option value="meterTwo">1м.50 см</option>
<option value="meterThree">1м.70 см</option>
</select>

<!-- Опции услуг -->
  <label for="opt">
<input type="checkbox" class="optionally" id="opt"><p>Цвет ванны</p>
</label>

 <label for="opt1">
<input type="checkbox" class="optionally" id="opt1"><p>Установка уголка</p>
</label>

<label for="opt2">
<input type="checkbox" class="optionally" id="opt2"><p>Установка сливной системы</p>
</label>

 <label for="opt3">
<input type="checkbox" class="optionally" id="opt3"><p>Установка экрана под ванну</p>
</label>

<label for="opt4">
<input type="checkbox" class="optionally" id="opt4"><p>Установка счетчиков.гор. холодной воды</p>
</label>

    <label for="opt5">
<input type="checkbox" class="optionally" id="opt5"><p>Установка счетчиков.хол. горячей воды</p>
</label>
    <h3>Итого</h3>

</div>

<div class="block-right">
<!-- checkbox list  -->

<!-- Здесь значение меняются от выбранных вариантов -->

<!-- size product -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от первого select -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от второго select -->

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">

<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<br>
</div>

<input type="text" class="summa" placeholder="Сумма">
</form>

  </div>

<script>
window.addEventListener("DOMContentLoaded", function() {
    var d = {
            Enamelling: { // Эмалировка
                product: 1500,  // цена
                meterOne: 1400, // стоимость длины ванны 1.20
                meterTwo: 1500, // стоимость длины ванны 1.50
                meterThree: 1500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
            Starkril: { // Старкрил 2

                product: 2000, // цена
                meterOne: 1400, // стоимость длины ванны 1.20
                meterTwo: 1500, // стоимость длины ванны 1.50
                meterThree: 1500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
            liquidAcrylic: { // Жидкий акрил
                product: 3000, // цена
                meterOne: 1500, // стоимость длины ванны 1.20
                meterTwo: 2000, // стоимость длины ванны 1.50
                meterThree: 2500, //стоимость длины ванны 1.70
                colorBath: 0, // стоимость цвета заливки
                option: 1500, // checkbox установка уголка
                optionTwo: 1400, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },

            AcrylicLiner: { // Акриловый вкладыш
                product: 1500, // цена
                meterOne: 1400,  // стоимость длины ванны 1.20
                meterTwo: 3000, // стоимость длины ванны 1.20
                meterThree: 3000, //стоимость длины ванны 1.70
                colorBath: 2000, // стоимость цвета заливки
                option: 2000, // checkbox установка уголка
                optionTwo: 0, // checkbox установка сливной системы
                optionThree: 2000, // checkbox установка экрана под ванну
                optionFour: 850, // установка счетчиков гор.холодн.воды
                optionFive: 900 // установка счетчиков хол. горячей воды
            },
        },
        f = document.querySelector("#form"),
        g = f.querySelector(".summa"),
        h = f.querySelectorAll(".rez"),
        a = f.querySelectorAll(".ListService, .meters, #opt,#opt1, #opt2, #opt3, #opt4,#opt5"),
        b,
        k = ["colorBath","option","optionTwo","optionThree","optionFour","optionFive"],
        m = {Starkril : {meterOne : { option: 1500,
  optionTwo: 1400,
  optionThree: 2000},

  meterTwo : {
  option: 2400,
  optionTwo: 0,
  optionThree: 0,
  optionFour: 0,
  optionFive: 0
  },
  meterThree : {
  colorBath: 0,
  option: 2400,
  optionTwo: 0,
  optonThree: 1000,
  optionFour: 0,
  optionFive: 0
  }  } }


        ;
    f.addEventListener("change", function() {
        var c = a[0].value;
        b = [0, 0, 0, 0, 0 , 0, 0];
        if (c) {
            b[0] = d[c].product;
            var e = a[1].value;
            e && (b[1] = d[c][e]);
            k.forEach(function(el,i) {
       a[i+2].checked && (b[i+2] =  m[c] &&  m[c][e] && m[c][e][el] !== void(0)  ? m[c][e][el] : d[c][el] )
});

        } else a[2].value = "";
        g.value = b.reduce(function(b, a, c) {
            h[c].value = a + " руб.";
            return b + a
        }, 0) + " руб."
    })
});

</script>



</body>
</html>

warren buffet 25.09.2016 16:03

Цитата:

Сообщение от dzho
Для различных сайт визиток, landing page.

Это не для вас молодой человек было написано, а для тех, кто не дай бог напорется на такое гавно и подумает, что и так можно делать. Чтобы видели, что так делать нельзя. А тебе можно. У тебя же jsom

dzho 25.09.2016 17:38

warren buffet а как вы бы реализовали такой не большой калькулятор. И почему у Вас столько негатива к этому коду ? Очень интересно в чем его минусы?

dzho 25.09.2016 17:39

Рони а Вам огромное спасибо:)

warren buffet 25.09.2016 17:56

Цитата:

Сообщение от dzho
реализовали

Реализация чего? У тебя ни одного товара нет, как ты реализуешь то, чего не существует?

dzho 25.09.2016 18:03

это калькулятор с выбором услуг.

warren buffet 25.09.2016 20:06

Услуги и товары одни и те же сущности.

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

<!DOCTYPE html>
<html lang="ru" dir="ltr">
<head>
<meta charset="utf-8">

<script>

var

CURRENCY = ' руб.',

works={

	title:'Услуга',
	data:{
		1:'Эмалировка',
		2:'Старкрил 2',
		3:'Жидкий акрил',
		4:'Акриловый вкладыш'
	},
	
},

params={

	opt:{
		title:'Опции',
		data:{
			1:'Установка уголка',
			2:'Монтаж экрана',
			3:'Монтаж слива',
			4:'Счетчик горячей воды',
			5:'Счетчик холодной воды'
		}
	},

	hue:{
		title:'Оттенок',
		data:{
			1:'Белый',
			2:'Красный',
			3:'Желтый',
			4:'Синий'
		}
	},

	len:{
		title:'Длина, см',
		data:{
			1:'120',
			2:'150',
			3:'170',
			4:'200'
		}
	}
},

offers={

	1:{
		price:1500,
		params:{
			len:{
				1:1400,
				2:1500,
				3:1500
			},
			hue:{
				1:0,
				2:120,
				3:150,
				4:90
			},
			opt:{
				1:1500,
				2:1700,
				3:2000,
				4:3000,
				5:2000
			}
		}
	},
	
	2:{
		price:2500,
		params:{
			len:{
				1:1200,
				2:1300,
				3:1700
			},
			hue:{
				1:0,
				2:220,
				3:250,
				4:190

			},
			opt:{
				1:1200,
				2:1500,
				3:1800,
				4:2900,
				5:2500
			}
		}
	},
	
	3:{
		price:1900,
		params:{
			len:{
				1:1200,
				2:1780,
				3:1499
			},
			hue:{
				1:0,
				2:126,
				3:145,
				4:199
			},
			opt:{
				1:1500,
				2:1700,
				3:2000,
				4:3000,
				5:2000
			}
		}
	},
	
	4:{
		price:1500,
		params:{
			len:{
				1:1400,
				2:1500,
				3:1500
			},
			hue:{
				1:0,
				2:120,
				3:150,
				4:90
			},
			opt:{
				1:1500,
				2:1700,
				3:2000,
				4:3000,
				5:2000
			}
		}
	}
}

total=0,prodList=calcButton=null;

function resetList(el){
	v=el.querySelectorAll('select');
	for(var i=0;i<v.length;i++)
		v[i].selectedIndex=-1;
}

function renderParams(ev){

	if(ev.target.nodeName!='SELECT') return;
	var v=ev.target.value;
	if(!(v in offers)) return;
	var offer=offers[v],html=[];
	
	total=offer.price;
	
	for(v in offer.params) {
		var h=[];
		for(var p in offer.params[v])
			h.push(renderOption(offer.params[v][p],params[v].data[p]
				+' + '+offer.params[v][p]+CURRENCY));
		html.push('<label>'+params[v].title+': </label>'
			+'<select>'+h.join('')+'</select>'+'<br/><br/>');
	}
	
	prodList.innerHTML=html.join('');
	resetList(prodList);
	calcButton.disabled=false;
}

function renderOption(v,t){
	return '<option value="'+v+'">'+t+'</option>';
}

function renderOptions(obj){
	var html=[];
	for(var p in obj)
		html.push(renderOption(p,obj[p]+': '+offers[p].price+CURRENCY));
	return html.join('');
}

function renderWorks(classname) {
	var el=document.querySelector('.'+classname);
	el.innerHTML='<label>'+works.title+': <label>'
		+'<select>'+renderOptions(works.data)+'</select>';
	resetList(el);
	el.addEventListener('change',renderParams);
}

function renderTotal(){
	v=prodList.querySelectorAll('select');
	for(var i=t=0;i<v.length;i++)
		t+= +v[i].value;
	document.querySelector('.total-sum').textContent=(total+t)+CURRENCY;
}

</script>

</head>
<body>

<div class="filters-block"></div><br/><br/>
<div class="product-list"></div>
<button class="calc-total" disabled="disabled">Рассчитать</button><br/><br/>
<div class="total-sum"></div>

<script>
prodList=document.querySelector('.product-list');
calcButton=document.querySelector('.calc-total');
calcButton.addEventListener('click',renderTotal);
renderWorks('filters-block');
</script>

</body>
</html>

warren buffet 25.09.2016 20:12

С опциями, которые экраны-уголки-счетчики, разбирайся сам. Никаких признаков множественного выбора в предоставленных данных не было. Что в каментах написано - то не данные, а каменты. Но главное с хера ли они вообще в товаре. Разбирайся. Теперь все нормализовано.


Часовой пояс GMT +3, время: 02:16.