Скрипт калькулятора стоимости

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

Пункты, которые нужно заполнять пользователям

Событие oninput происходит когда элемент меняет своё значение в момент фокуса.


длина ширина
площадь прямоугольника

<form onsubmit="return false;"

oninput=" 
document.getElementById('rezultat').innerHTML 
= 
parseFloat(document.getElementById('a').value)
*
parseFloat(document.getElementById('b').value)
"
>
длина <input id="a" type="number"> ширина <input id="b" type="number">  
площадь прямоугольника <output id="rezultat"></output>
</form>
или так
<script type="text/javascript">
function changeText0(){
 var rezultat = 1;
 rezultat *= parseFloat(document.getElementById('a').value);
 rezultat *= parseFloat(document.getElementById('b').value); 
 document.getElementById('rezultat').innerHTML = rezultat;
}
</script>

<form onsubmit="return false;" oninput="changeText0()">
длина <input id="a" type="number"> ширина <input id="b" type="number">  
площадь прямоугольника <output id="rezultat"></output>
</form>
Другой пример.

Добавим выпадающий список

Событие onchange происходит когда элемент меняет своё значение на момент потери фокуса. Видно в IE. Поэтому если присутствуют два разных типов input, к которым лучше применить разное событие, выносим скрипт за форму.



= 1 мм

<script type="text/javascript">
function changeText(){
 var rezultat1 = 0;
 var odin = document.getElementById('odin').value;
 var spisok = document.getElementById('spisok').options[document.getElementById('spisok').selectedIndex].value;
 rezultat1 = parseFloat(odin);
 rezultat1 *= parseFloat(spisok); 
 document.getElementById('rezultat1').innerHTML = rezultat1;
}
</script>

<form onsubmit="return false;">
<input id="odin" type="number" value="1" oninput="changeText()"> <select id="spisok" onchange="changeText()">
<option value="1">мм</option>
<option value="10">см</option>
<option value="1000">м</option>
<option value="1000000">км</option>
</select> = <output id="rezultat1">1</output> мм
</form>

Добавим чекбокс type="checkbox"

Событие onclick происходит при щелчке левой клавишей мышки на элементе. На основе этого скрипта.




1

площадь квадрата = квадрату его стороны S = a2
площадь круга = квадрату его радиуса умноженного на число "пи" S = ?R2

<style type="text/css">
  #rezultat2:before { content: "площадь квадрата  "; }
  #krug:checked ~ #rezultat2:before { content: "площадь круга  "; }
</style>

<script type="text/javascript">
function kalkulyator(){
  var rezultat2 = 1;
  rezultat2 *= parseFloat(document.getElementById('odin1').value) * parseFloat(document.getElementById('odin1').value);
  if (document.getElementById('krug').checked)
     rezultat2 *= parseFloat(document.getElementById('krug').value);
  document.getElementById('rezultat2').innerHTML = rezultat2;
}
</script>

<form onsubmit="return false;">
<input id="odin1" type="number" value="1" oninput="kalkulyator()"> 
<label for="krug">для расчёта площади круга</label> <input type="checkbox" id="krug" value="3.141592653589793" onclick="kalkulyator()"/>
<output id="rezultat2">1</output>

площадь квадрата = квадрату его стороны S = a<sup>2</sup>
площадь круга = квадрату его радиуса умноженного на число "пи" S = ?R<sup>2</sup>
</form>

С помощью псевдокласса :checked и псевдоэлемента :before меняем текст перед результатом.

Добавим флажок type="radio"

То же самое, что и выше.


год


число дней в году: 366

<script type="text/javascript">
function kalkulyator4(){
if (document.getElementById('vis').checked)
     var flag = document.getElementById('vis').value;
if (document.getElementById('vis1').checked)
     var flag = document.getElementById('vis1').value;

if (parseFloat(document.getElementById('god').value)/parseFloat(flag)  == parseInt(document.getElementById('god').value/parseFloat(flag)) )
{ document.getElementById('rezultat4').innerHTML = 366; }
else
{ document.getElementById('rezultat4').innerHTML = 365; };
}
</script>

<form onsubmit="return false;">
год <input id="god" type="number" value="2012" oninput="kalkulyator4()"> 
<label>каждый год, например, 2012 <input type="radio" id="vis" value="4" checked="checked" name="raz10" onclick="kalkulyator4()"/></label>
<label>исключение, каждый сотый год, например, 2100 <input type="radio" id="vis1" value="400" onclick="kalkulyator4()" name="raz10"/></label>
число дней в году: <output id="rezultat4">366</output>
</form>

Проверка на целое число javascript

Столкнулась в этом примере, поскольку года, которые делятся на 4 без остатка, являются високосными (искл. каждый сотый год, но не каждый четырёхсотый). Условие такое:

if (parseFloat(document.getElementById('god').value)/4 == parseInt(document.getElementById('god').value/4) )
{ ... }
else
{ ... }; 
parseFloat возвращает дробное число,
parseInt возвращает целое число.

Смена select в зависимости от установленного флажка


материки часть света

Площадь 54 млн. км2

<style type="text/css">
  #b15:checked ~ #spisok15 { display: none; }
  #a15:checked ~ #spisok14 { display: none; }
</style>

<script type="text/javascript">
function kak(){

if (document.getElementById('a15').checked)
     var flag15 = document.getElementById('spisok15').options[document.getElementById('spisok15').selectedIndex].value;

if (document.getElementById('b15').checked)
     var flag15 = document.getElementById('spisok14').options[document.getElementById('spisok14').selectedIndex].value;

document.getElementById('rezultat15').innerHTML = parseFloat(flag15);
}
</script>

<form onsubmit="return false;" onchange="kak()">

материки <input type="radio" id="a15" checked="checked" name="raz15"/> часть света <input type="radio" id="b15" name="raz15"/>

<select id="spisok15">
<option value="54">Евразия</option>
<option value="30">Африка</option>
<option value="24">Северная Америка</option>
<option value="17">Южная Америка</option>
<option value="9">Австралия</option>
<option value="14">Антарктида</option>
</select><select id="spisok14">
<option value="11">Европа</option>
<option value="43">Азия</option>
<option value="30">Африка</option>
<option value="42">Америка</option>
<option value="9">Австралия и Океания</option>
<option value="14">Антарктида</option>
</select>

Площадь <output id="rezultat15">54</output> млн. км<sup>2</sup>
</form>
Ещё примеры.
в f t
наверх ↑

35 комментариев:

Baxa Cveridov
Спасибо, кратко и понятно!
Вопрос
Baxa Cveridov
Километры и особенно площадь не могут быть отрицательными. Как можно убрать показ результата когда пользователь выбрал отрицательные цыфры ?
NMitra
Самый простой вариант:

<input type="number" min="0">

но пока не всеми браузерами поддерживается :(
NMitra
Позволяет вводить только числа:

<input pattern="\d+"/>

ни букв, ни минусов...
Archeton
Доброе времени суток! Нужен скрипт калькулятора для внедрения в HTML тело сайта. Пример можно глянуть тут:
http://berezaksi.by/index.php/raschjot-blokov
NMitra
Доброе время суток! Что вы хотите от меня? Чтобы я помогла сделать что-то подобное? Тогда покажите что у вас уже есть. Чтобы я сделала сама? Это не будет бесплатно.
FOMUVI
Какие классные примеры, спасибо большое. Скоратил php код в разы :-) Аж разуюсь. Один вопросик созрел: у меня сразу в обоих полях есть уже дефолтные значения (рекомендуемые). Но пока я не начинаю вводить изменения хотя бы в 1 поле - результат не выводится. Можно ли сделать, чтобы при загрузки страницы сразу показывался результат?
NMitra
Так?
<input value="я показан сразу">
FOMUVI
Я так сразу сделал, думал прокатит, но нет. Если ставлю value изначально, то потом это число не меняется при изменении первого или второго числа.
FOMUVI
Даже плейсхолдер "ломает" подсчеты
NMitra
Приведите постой пример на http://jsfiddle.net/ иначе не понятно
FOMUVI
Вот код моей формы http://jsfiddle.net/0kscg284/
Объясню просто. Форма, в ней циклом может до 8 таблиц рисоваться. Допустим, что она одна всего (табличка). Я так понимаю, пока php обрабатывает скрипт, Ява уже смотрит, что там, а там ещё нет значений и пока ничего не выдает,так? :-) А когда начинаю щёлкать - уже срабатывает. Нашел совет, типа поставить скрипт в конец, после формы. Но ничего, к сожалению, не изменилось - пусто при загрузке страницы.
NMitra
Перекидывать значения php и javascript можно с помощью new XMLHttpRequest() . Простой пример http://shpargalkablog.ru/2014/07/adblock.html

Я бы передавала в JS значения, а с помощью JS делала подсчёты.
FOMUVI
Может дело в другом? Ведь при нажатии всё начинает считаться верно. Для простоты я сохранил ваш первый пример в HTML, для каждого поля ввёl value. Теперь в полях отображается сразу длина 10, ширина 5, но площадь НЕ отображается (просто пусто), пока не начинаю изменять цифры в полях - тогда появляются цифры.
FOMUVI
NMitra, ваша отзывчивость дороже золота :-) спасибо большое. Решение найдено. Заметил по примеру с выпадающим списком, что там внутри output есть изначально единица (да что угодно), а после нажатий она затирается на нужное значение. Это же класс, это выход. С помощью PHP формулу туда вставил, потому страница загрузилась, а там уже результат! А в ява такая же формула, потому нажал кнопку и как надо изменилось :-) В общем, благодаря нескольким строкам на яве удалил одну страницу PHP.
NMitra
Кажется я поняла что вы хотите добиться. Сравните
http://jsfiddle.net/NMitra/kowhr3s9/
http://jsfiddle.net/NMitra/kowhr3s9/1/

То есть в первом случае функция исполняется после какого-то действия. Во-втором, после загрузки страницы или выполнения какого-то действия (нажатия, фокуса, изменения значения и т.п.)
FOMUVI
Второй вариант самый подходящий :-) спасибо! Доделал. Пошёл дальше читать ваши уроки.
Анонимный
Спасибо за урок. А не подскажите, как правильно использовать функцию math.ceil? Использую её в скрипте:
function insertTotal() {
if (edizm.value=="1"){
var per=id.value /dltr;
var perr= math.ceil(parseFloat(per));
var count = perr*dltr* vespm;


total.innerHTML = 'Эквивалентно: ' + count +'тн';
} else {
var count = id.value / vespm;

total.innerHTML = 'Эквивалентно: ' + count +'пм' ;}
}
}
Но она не работает, результат не выводится. Может подскажите, что не так?
NMitra
А расскажите что именно вы хотите добиться (если при этом выложите код на http://jsfiddle.net/ будет совсем хорошо)
Анна
Спасибо огромнейшее!!! Очень помогли! Уже не первый раз ваш сайт выручает, все по полочкам разложено, как раз для новичков, таких, как я))
NMitra
Благодарю за комментарий!
Сейчас уже не так хорошо получается - знания мешают :( Когда сама новичок и пишешь для новичков, как ни странно, проще. Потом невольно упускаешь важные детали.
Unknown
Спасибо!
Очень полезные примеры.
А не подскажете, как вот еще сохранить полученный результат?
document.getElementById('rezultat1').innerHTML = rezultat1;
NMitra
Локальное хранилище http://shpargalkablog.ru/2013/06/localStorage.html или PHP, например, file_get_contents, или вытягивать из БД при загрузке
Tatiana Bokareva
Спасибо, сейчас попытаюсь донести свою мысль... вот кусочек скрипта


function changeText(){
var bill1 = 0;
var bill = 0;
var fullbill = 0;
var fullbill1 = document.getElementById('fullbill1').value;
var firstAccount = document.getElementById('firstAccount').options[document.getElementById('firstAccount').selectedIndex].value;
var firstPc = document.getElementById('firstAccount').options[document.getElementById('firstAccount').selectedIndex].id;


bill1 = parseFloat(fullbill1);
bill1 = bill1-bill1*parseFloat(firstPc)/100;
bill = bill1;
fullbill = parseFloat(fullbill1);

document.getElementById('bill1').innerHTML = bill1;
document.getElementById('bill').innerHTML = bill;
document.getElementById('fullbill').innerHTML = fullbill;

}

...............
а вот процедура выбора:





{$accn1} -{$accnpc1}%
{$accn2} -{$accnpc2}%
{$accn3} -{$accnpc3}%
{$accn4} -{$accnpc4}%
{$accn5} -{$accnpc5}%

= {$bill1} руб


и в идеальном варианте, мне бы куда-нибудь приткнуть hidden поле ввода для {$bill1}, не могу придумать, как сделать, чтобы оно заполнялось полученным значением.
А дальше я его уже сохраню при помоpщи php
Tatiana Bokareva
н-да... что-то не опубликовалась
Tatiana Bokareva

вот она: http://jsfiddle.net/fsLn9w7m/
NMitra
Эх, всё равно не поняла, так?

document.getElementById('bill1').style.visibility = 'hidden';

http://shpargalkablog.ru/2015/05/style-css-javascript.html
Tatiana Bokareva
Ага... Сейчас попробую, спасибо!
Tatiana Bokareva
Не сохраняется оно. Сейчас попробую прояснить.
В форме происходит 3 вещи:
1 - вводится сумма fullbill1,
2 - выбирается дисконт: $account1 ,
3 - считается сумма с дисконтом bill1.
Ну там помимо этого считаются итоги, но это не критично.

При этом замечательно сохраняются только 2 параметра:
fullbill1, - как введенное пользователем число <input class...
account1, - как результат выбора <select....
а как сохранить при записи документа bill1 я не понимаю ((
NMitra
Скрипт на load вешайте. При загрузке страницы он заново будет просчитывать. Самый простой вариант отработки функции при загрузки страницы и при нажатии кнопки https://jsfiddle.net/NMitra/nrwzxzou/

document.getElementById('dva').onclick = raz;
raz();
function raz() {
alert(1+2);
}

Есть ещё вариант http://shpargalkablog.ru/2013/06/localStorage.html но я бы в данном случае использовала первый (если правильно поняла проблему).
Tatiana Bokareva
Попробую с local storage. Мне кажется, первый вариант немного про другое, т.к. число вводится пользователем уже после открытия страницы. Спасибо за помощь! ))
Tatiana Bokareva
В общем я поняла, что у меня так и не получилось выразить свою мысль ))) Заполнение поля сделала вот так:

var hidden_ac = $('.form-autocount input[name="bill1"]');
$('.form-autocount input[name="bill1"]').val(bill1);

http://jsfiddle.net/fsLn9w7m/
NMitra
Главное, что всё что хотелось, удалось :)
Тимур Сарсембаев
Здравствуйте. Просьба подсказать решение.
Нужно сделать простой калькулятор, но вот знаний не хватает.

Налоговый режим
Упрощенный < input type="radio" id="inpX" checked="checked" value="5000"/>
Общеустановленный < input type="radio" id="inpY" value="10000"/>
Кассовый аппарат
Да < input type="radio" id="inpX" checked="checked" value="10000"/>
Нет < input type="radio" id="inpY" value="0"/>
< button id="btnRun">Рассчитать
< span id="spnResult">

< script type="text/javascript">
function calculate(){
if document.getElementById('inpX').checked)
var z = input[document.getElementById('inpX').selectedIndex].value;
if document.getElementById('inpY').checked)
var z = input[document.getElementById('inpY').selectedIndex].value;
if document.getElementById('inpA').checked)
var a = input[document.getElementById('inpA').selectedIndex].value;
if document.getElementById('inpB').checked)
var a = input[document.getElementById('inpB').selectedIndex].value;
var spnResult = document.getElementById('spnResult');
var r = z+a;
spnResult.innerHTML = r;
}

window.onload = function(){
var btnRun = document.getElementById('btnRun');
btnRun.onclick = calculate;
}
Тимур Сарсембаев
Решение нашел http://ruseller.com/lessons.php?rub=32&id=889