27.11.2017, 18:43
|
Интересующийся
|
|
Регистрация: 20.11.2017
Сообщений: 29
|
|
Каклькулятор
Подскажите, пожалуйста, писала скрипт ( калькулятор для магазина), подключаю и не работает, подскажите, что не так
Нужно узнать цену книги, зависящую от размера страниц,цвета страниц,количества разворотов ,вид обложки,переплет, тираж
var button = document.getElementById("button_count");
button.onclick = function(){
var size = document.getElementById("page_size").value,
page_color = document.getElementById("color").value,
page_num = document.getElementById("qty").value,
cover=document.getElementById("cover").value,
binding = document.getElementById("binding").value,
edit = document.getElementById("edition").value,
price_size = 0,
price_color = 0,
price_cover = 0,
price_binding = 0;
switch(size){
case "A4" : price_size = 4.15;
break;
case "A5" : price_size = 4;
break;
case "A6" : price_size = 3.10;
break;
case "gen": price_size = 2.15;
break;
}
switch(page_color) {
case "bw" : price_color = 1.20;
break;
case "col" : price_color = 2.45;
break;
}
switch(cover) {
case "bw" : price_cover = 10;
break;
case "col" : price_cover = 12;
break;
case "sk" : price_cover = 16;
break;
case "lam" : price_cover = 21.20;
break;
}
switch(binding) {
case "soft" : price_binding = 14;
break;
case "solid" : price_binding = 21;
break;
case "staples" : price_binding = 12;
break;
case "spring" : price_binding = 32;
break;
}
var ans = (price_size*page_num + price_color + price_cover + price_binding)*edit;
document.getElementById("out").innerHTML = ans + "руб";
alert("подключен");
|
|
27.11.2017, 19:25
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Код форматировать надо. Все это можно упростить. Похоже что switch проверяется значения выпадающих списков? HTML код покажите.
|
|
27.11.2017, 19:28
|
Интересующийся
|
|
Регистрация: 20.11.2017
Сообщений: 29
|
|
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="charset" content="windws-1251">
<script src="2.js"></script>
</head>
<body>
<h1>Калькулятор расчета стоимости печати книги в типографии</h1>
<div class="form-group" style="margin-bottom: 15px;">
<label for="page-size">Размер страницы</label>
<select id="page-size" class="form-control">
<option selected>Выберите размер страницы</option>
<option value="A4">A4(205*202мм)</option>
<option value="A5">A5(145*200мм)</option>
<option value="A6">A6(100*140мм)</option>
<option value="gen">Формат(200*200мм)</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label for="color">Цвет страниц</label>
<select id="color" class="form-control">
<option selected>Выберите цвет страниц</option>
<option value="bw">Черно-белые</option>
<option value="col">Цветные</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label for="qty">Количество разворотов</label>
<input class="form-control" type="number" name="num" size="3" min="1" value="1" id="qty">
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label for="cover">Вид обложки</label>
<select id="cover" class="form-control">
<option selected>Выберите вид обложки</option>
<option value="bw">Черно-белая</option>
<option value="col">Цветная</option>
<option value="sk">Под кожу с тиснением</option>
<option value="lam">Ламинация</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label for="binding">Переплет</label>
<select id="binding" class="form-control">
<option selected>Выберите переплет</option>
<option value="soft">Мягкий</option>
<option value="solid">Твердый</option>
<option value="staples">Сшить скобами</option>
<option value="spring">Пружина</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label for="edition">Тираж</label>
<input class="form-control" type="number" name="num" size="10" min="1" value="1" id="edition">
</div>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<input type="button" id="button_count" value="Посчитать">
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label for="out">Cтоимость :</label>
<output id="out"></output>
</div>
|
|
27.11.2017, 19:30
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
KATRIN1786492,
нет элементов с которыми работает скрипт, или скрипт в load или вниз страницы.
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|
27.11.2017, 19:32
|
Интересующийся
|
|
Регистрация: 20.11.2017
Сообщений: 29
|
|
var button = document.getElementById("button_count");
button.onclick = function(){
var size = document.getElementById("page_size").value,
page_color = document.getElementById("color").value,
page_num = document.getElementById("qty").value,
cover=document.getElementById("cover").value,
binding = document.getElementById("binding").value,
edit = document.getElementById("edition").value,
price_size = 0,
price_color = 0,
price_cover = 0,
price_binding = 0;
switch(size){
case "A4" : price_size = 4.15;
break;
case "A5" : price_size = 4;
break;
case "A6" : price_size = 3.10;
break;
case "gen": price_size = 2.15;
break;
}
switch(page_color) {
case "bw" : price_color = 1.20;
break;
case "col" : price_color = 2.45;
break;
}
switch(cover) {
case "bw" : price_cover = 10;
break;
case "col" : price_cover = 12;
break;
case "sk" : price_cover = 16;
break;
case "lam" : price_cover = 21.20;
break;
}
switch(binding) {
case "soft" : price_binding = 14;
break;
case "solid" : price_binding = 21;
break;
case "staples" : price_binding = 12;
break;
case "spring" : price_binding = 32;
break;
}
var ans = (price_size*page_num + price_color + price_cover + price_binding)*edit;
document.getElementById("out").innerHTML = ans + "руб";
alert("подключен");
|
|
27.11.2017, 19:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
У поля типа number нужно обрабатывать событие onchange (также нужно учитывать, что в данное поле можно и непосредственно вводить). Расчет производить только если во всех списках есть выбор, какой смысл ноль показывать?
Но это не главное. Лучше все определить объектом получая данные из него по выбору в списках. А еще лучше прописать все зависимости в data атрибутах опций списков. Эти данные ведь сервером определяются, а инфляция ..., значит проще менять цены в самих списках при выводе формы, а не изменять в скриптах.
PS. О типе nember снимается, кнопка расчета это не оно.
Последний раз редактировалось laimas, 27.11.2017 в 19:43.
|
|
27.11.2017, 19:41
|
Интересующийся
|
|
Регистрация: 20.11.2017
Сообщений: 29
|
|
немного не понимаю, вы не могли бы написать ? была бы очень признательна... уже долго мучаюсь с этим кодом, мозг не варит
|
|
27.11.2017, 19:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от KATRIN1786492
|
вы не могли бы написать ?
|
Напишу, с учетом, что данные необходимые содержит форма (почему, пояснение выше).
Но есть еще один момент. Все расчеты на клиенте, это сугубо для него. Но если магазин и нужно обрабатывать заказ, то форма отправляется серверу. Сервер же сам обязан не только просчитать, но еще и проверить истинность входных данных. Дело конечно хозяйское, но хранить в базе значения которые определяются как "bw", "col", "sk", и т.п., это не самое лучшее, что можно было бы сделать. Это усложняет проверку входных данных сервером, так как требуется запрос в базу. Держать же на сервере, а тем более такие вещи, вне базы определяя их еще где либо, это вообще плохо. Как ни крути, а цены, курсы ..., к сожалению не являются постоянными, а значит требуют редактирования.
Просто подумайте над этим.
|
|
27.11.2017, 20:23
|
Интересующийся
|
|
Регистрация: 20.11.2017
Сообщений: 29
|
|
Это мне для университета)
Нужно каждому создать свой сайт, я создаю сайт магазина)
|
|
27.11.2017, 21:53
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от KATRIN1786492
|
Это мне для университета
|
А что так плохо учимся, не изучаем материал? )
Я не знаю что там думают в университетах, но вы разрабатываете проект для реального магазина. А это означает, что вы должны продумывать все, включая и вопросы проектирования базы данных, без нее магазина не будет. А разработчик думающий ни за что не будет описывать данные в базе так, как вы при думали. С чем это связано я говорил. Сервер с клиентом, это одна связка, если каждый будет сам по себе, один другому будут отдавать данные под чем угодно выдуманным, то второму придется попотеть разбирая их. У вас уже есть ошибка - два поля формы отвечающие за разное имеют одно и тоже имя - name="num". При этом поля списков их не имеют, а только идентификаторы, которые в общем то здесь не нужны.
Лишнее удалено из полей, добавлено нужное. Данные для расчета содержатся в полях формы (защищая проект обосновывайте почему).
Это форма:
<form autocomplete="off" id="calc">
<div class="form-group" style="margin-bottom: 15px;">
<label>Размер страницы</label>
<select name="size" class="form-control">
<option selected value="" disabled>Выберите размер страницы</option>
<option value="A4" data-price="4.15">A4(205*202мм)</option>
<option value="A5" data-price="4">A5(145*200мм)</option>
<option value="A6" data-price="3.10">A6(100*140мм)</option>
<option value="gen" data-price="2.15">Формат(200*200мм)</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label>Цвет страниц</label>
<select name="color" class="form-control">
<option selected value="" disabled>Выберите цвет страниц</option>
<option value="bw" data-price="1.20">Черно-белые</option>
<option value="col" data-price="2.45">Цветные</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label>Количество разворотов</label>
<input class="form-control" type="number" name="turn" size="3" min="1" value="1">
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label>Вид обложки</label>
<select name="cover" class="form-control">
<option selected value="" disabled>Выберите вид обложки</option>
<option value="bw" data-price="10">Черно-белая</option>
<option value="col" data-price="12">Цветная</option>
<option value="sk" data-price="16">Под кожу с тиснением</option>
<option value="lam" data-price="21.20">Ламинация</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label>Переплет</label>
<select name="binding" class="form-control">
<option selected value="" disabled>Выберите переплет</option>
<option value="soft" data-price="14">Мягкий</option>
<option value="solid" data-price="21">Твердый</option>
<option value="staples" data-price="12">Сшить скобами</option>
<option value="spring" data-price="32">Пружина</option>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label>Тираж</label>
<input class="form-control" type="number" name="circulat" size="10" min="1" value="1">
</div>
</select>
</div>
<div class="form-group" style="margin-bottom: 15px;">
<input type="button" id="calculate" value="Посчитать">
</div>
<div class="form-group" style="margin-bottom: 15px;">
<label>Cтоимость :</label>
<output id="total"></output>
</form>
Вообще-то формы для заказа, а попутно и рассчитать, а значит форма должна отправляться, у вас этого нет. Хотя что подразумевается под магазином в вашем случае не знаю, чего вы там планируете.
Скриптов два - первый вариант, это автоматический просчет при выборе в полях формы (кнопка Посчитать не нужна), второй выбором по кнопке Посчитать.
document.addEventListener("DOMContentLoaded", function() {
document.querySelector('#calc').addEventListener("change", function() {
var size = this.elements.namedItem('size'),
color = this.elements.namedItem('color'),
cover = this.elements.namedItem('cover'),
binding = this.elements.namedItem('binding'),
result = this.elements.namedItem('total');
result.value = ""; //очистить поле расчета
if(!size.value || !color.value || !cover.value || !binding.value) return; //если нет выбора в списках
result.value = ((
parseFloat(size.options[size.selectedIndex].attributes['data-price'].value)
*
this.elements.namedItem('turn').valueAsNumber
+
parseFloat(color.options[color.selectedIndex].attributes['data-price'].value)
+
parseFloat(cover.options[cover.selectedIndex].attributes['data-price'].value)
+
parseFloat(binding.options[binding.selectedIndex].attributes['data-price'].value)
) * this.elements.namedItem('circulat').valueAsNumber).toFixed(2);
});
});
document.addEventListener("DOMContentLoaded", function() {
document.querySelector('#calc').addEventListener("change", function() {
document.querySelector('#total').value = ""; //очистить поле расчета
});
document.querySelector('#calculate').addEventListener("click", function() {
var fields = document.querySelector('#calc').elements,
size = fields.namedItem('size'),
color = fields.namedItem('color'),
cover = fields.namedItem('cover'),
binding = fields.namedItem('binding'),
result = fields.namedItem('total');
if(!size.value || !color.value || !cover.value || !binding.value) { //если нет выбора в списках
alert("Не во всех полях формы сделан выбор!");
return;
}
result.value = ((
parseFloat(size.options[size.selectedIndex].attributes['data-price'].value)
*
fields.namedItem('turn').valueAsNumber
+
parseFloat(color.options[color.selectedIndex].attributes['data-price'].value)
+
parseFloat(cover.options[cover.selectedIndex].attributes['data-price'].value)
+
parseFloat(binding.options[binding.selectedIndex].attributes['data-price'].value)
) * fields.namedItem('circulat').valueAsNumber).toFixed(2);
});
});
Последний раз редактировалось laimas, 27.11.2017 в 23:08.
|
|
|
|