пересчет суммы в заказе в зависимости от выбраных чекбоксов
Добрый день, форумчане, интересует такой вопрос: мне нужно автоматически пересчитывать товары в заказе в зависимости от введенного значения количества и нажатого чекбокса.
У меня пока сделан только подсчет в зависимости от измененного количества, вот скрипт(источник): function calculate(quantity, price, updItemId){ var anum = /(^\d+$)|(^\d+\.\d+$)/; if (!anum.test(quantity)) { alert('Введенное значение не является числом!'); return; } // сумма = количество * цену goodSum = quantity * price; document.getElementById(updItemId).innerHTML = goodSum; var meForm = document.getElementById('me_order_form'); var bdoArray = meForm.getElementsByTagName('bdo'); // устанавливаем начальное нулевое значение ОБЩЕЙ суммы var allSumm = 0; // и в цикле прибавляем к ней сумму каждого товара for (j = 0; j < bdoArray.length; j++) { allSumm = allSumm + parseFloat(bdoArray[j].innerHTML); } document.getElementById('total_sum').innerHTML = allSumm; } а это разметка формы <form id='me_order_form'> <table class="variants"> <tr> <th class="col1"><input type="checkbox"></th> <th class="col2">Размеры и комплекты</th> <th class="col3">Количество</th> <th class="col4">Стоимость, руб.</th> </tr> <tr> <td class="col1"><input type="checkbox" id="r1" onchange="sums()"></td> <td class="col2">товар 1</td> <td class="col3"><div class="count"><input type='text' value='0' id='inp_1' onBlur='calculate(this.value, "5000", "bdo_1")'></div></td> <td class="col4"><bdo dir='ltr' id='bdo_1'>5000</bdo></td> </tr> <tr> <td class="col1"><input type="checkbox" id="r2" onchange="sums()"></td> <td class="col2">товар 2</td> <td class="col3"><div class="count"><input type='text' value='0' id='inp_2' onBlur='calculate(this.value, "7000", "bdo_2")'></div></td> <td class="col4"><bdo dir='ltr' id='bdo_2'>7000</bdo></td> </tr> <tr> <td class="col1"><input type="checkbox" id="r3" onchange="sums()"></td> <td class="col2">товар 3</td> <td class="col3"><div class="count"><input type='text' value='0' id='inp_3' onBlur='calculate(this.value, "300", "bdo_3")'></div></td> <td class="col4"><bdo dir='ltr' id='bdo_3'>300</bdo></td> </tr> <tr class="bottom"> <td colspan="2" class="total">Общая сумма заказа: <span class="price" id='total_sum'>0</span> <span class="price">Р</span></td> <td colspan="2" class="order"><a href="#"></a></td> </tr> </table> </form> вопрос: как правильно написать, чтобы пересчет был только для строк, у которых активен чекбокс? Я писал в цикле , где сумма подсчитывается for (j = 0; j < bdoArray.length; j++) { var elem=document.getElementById("r"+i); if(elem.checked) allSumm = allSumm + parseFloat(bdoArray[j].innerHTML); } но так не считает общую сумму. Помогите, пожалуйста! |
georg, типа набросок...
<!DOCTYPE html> <html> <head> <!-- <script src="http://code.jquery.com/jquery-latest.js"></script> <link rel="stylesheet" type="text/css" href="tmp.css" /> --> <style type="text/css"> </style> <script type="text/javascript"> function calculate(Obj, price){ var o=Obj.parentNode.parentNode.parentNode; var anum = /(^\d+$)|(^\d+\.\d+$)/; var quantity=Obj.value; if (!anum.test(quantity)) { alert('Введенное значение не является числом!'); return; } // сумма = количество * цену goodSum = quantity * price; o.getElementsByTagName('bdo')[0].innerHTML = goodSum; sums(); }; function sums(Obj) { var meForm = document.getElementById('me_order_form'); if (!Obj.checked) { meForm.getElementsByTagName('input')[0].checked=false; } var bdoArray = meForm.getElementsByTagName('bdo'); // устанавливаем начальное нулевое значение ОБЩЕЙ суммы var allSumm = 0; // и в цикле прибавляем к ней сумму каждого товара for (j = 0; j < bdoArray.length; j++) { var o=bdoArray[j].parentNode.parentNode; if (o.getElementsByTagName('input')[0].checked) { allSumm = allSumm + parseFloat(bdoArray[j].innerHTML); } } document.getElementById('total_sum').innerHTML = allSumm; }; function allSumm(Obj) { var meForm = document.getElementById('me_order_form'); var o = meForm.getElementsByTagName('input'); var i; for (i = 0; i < o.length; i++) { if (o[i].type=='checkbox') { o[i].checked=Obj.checked; } } sums(Obj); } </script> </head> <body> <form id='me_order_form'> <table class="variants"> <tr> <th class="col1"><input type="checkbox" onclick='allSumm(this)'></th> <th class="col2">Размеры и комплекты</th> <th class="col3">Количество</th> <th class="col4">Стоимость, руб.</th> </tr> <tr> <td class="col1"><input type="checkbox" class='item' id="r1" onclick="sums(this)"></td> <td class="col2">товар 1</td> <td class="col3"> <div class="count"> <input type='text' value='0' id='inp_1' onBlur='calculate(this, 5000)'> </div> </td> <td class="col4"> <bdo dir='ltr' id='bdo_1'></bdo> </td> </tr> <tr> <td class="col1"><input type="checkbox" class='item' id="r2" onclick="sums(this)"></td> <td class="col2">товар 2</td> <td class="col3"><div class="count"><input type='text' value='0' id='inp_2' onBlur='calculate(this, 7000)'></div></td> <td class="col4"><bdo dir='ltr' id='bdo_2'></bdo></td> </tr> <tr> <td class="col1"><input type="checkbox" class='item' id="r3" onclick="sums(this)"></td> <td class="col2">товар 3</td> <td class="col3"><div class="count"><input type='text' value='0' id='inp_3' onBlur='calculate(this, 300)'></div></td> <td class="col4"><bdo dir='ltr' id='bdo_3'></bdo></td> </tr> <tr class="bottom"> <td colspan="2" class="total">Общая сумма заказа: <span class="price" id='total_sum'>0</span> <span class="price">Р</span></td> <td colspan="2" class="order"><a href="#"></a></td> </tr> </table> </form> </body> </html> |
<table id="myTable"> <tr> <th><input type="checkbox"> <th><input> </tr> <tr> <th><input type="checkbox"> <th><input> </tr> </table> <button id="myButton">sum = 0</button> <script> window.onload = function () { var myTable = document.getElementById('myTable'); var myButton = document.getElementById('myButton'); var rows = myTable.rows; var len = rows.length; var checkbox; var inp; var sum; myButton.onclick = function () { sum = 0; for (var i = 0; i < len; i++) { checkbox = rows[i].children[0].children[0]; inp = rows[i].children[1].children[0]; if (checkbox.checked == true && isNaN(parseFloat(inp.value)) != true) { sum += parseFloat(inp.value); } } myButton.innerHTML = 'sum = ' + sum; } } </script> |
ребята, огромное спасибо, все получилось)
ksa, если я оберну поле для ввода значения еще в один div (хочу справа и слева поставить ссылки "вперед"-"назад"), вот так: <tr> <td class="col1"><input type="checkbox" class='item' id="r3" onclick="sums(this)"></td> <td class="col2">товар 3</td> <td class="col3"> <div> <a class="left" href="#"></a> <div class="count"><input type='text' value='0' id='inp_3' onBlur='calculate(this, 300)'></div> <a class="right" href="#"></a> </div> </td> <td class="col4"><bdo dir='ltr' id='bdo_3'></bdo></td> </tr> то тогда не считает. требуется прописать дополнительный ParentNode для input? я попробовал, не сработало |
Цитата:
Цитата:
Цитата:
|
да, я знаю, что с маленькой буквы, спасибо. Еще раз спасибо, с вашей помощью все получилось.
|
ой классная штука. только я убрал эти чекбоксы. мне нужно просто 1 ячейка в которую вводишь кол и она пересчитывает цену.
подскажите следующее. как сделать. у меня есть $price1 $price2 $price3 к каждой цене привязано свое количество. типо если покупать товар до к примеру 10 шт это цена 1.(розница) если от 10 то цена 2(мелкий опт) и если к примеру от 50 то покупаешь по цене 3(крупный опт) вот как сделать что бы при пересчете оно это учитывало. ?) помогите плз. в явяскрипте не шарю абсолютно) |
ExXxTaSy,
<html> <head> <title></title> <script> var price1 = 10, price2 = 20, price3 = 30; function conversion(val) { var div = document.getElementById("div"), price = document.getElementById("price"); if (isNaN(val)) { div.innerHTML = ""; price.innerHTML = ""; } else { switch (true) { case (val <= 0): { div.innerHTML = ""; price.innerHTML = ""; break; } case (val < 10): { div.innerHTML = val*price1; price.innerHTML = price1; break; } case (val >= 10 && val < 50): { div.innerHTML = val*price2; price.innerHTML = price2; break; } case (val > 50): { div.innerHTML = val*price3; price.innerHTML = price3; break; } } } } </script> </head> <body> <input type="text" onBlur="conversion(this.value)" onChange="conversion(this.value)" onkeypress="conversion(this.value)" onkeyup="conversion(this.value)" value="1" id="txt"> <div id="div"></div><div id="price"></div> <script>window.onload = conversion(document.getElementById("txt").value);</script> </body> </html> |
Цитата:
|
ExXxTaSy, поправил предыдущий пост
|
Цитата:
громадное спасибо)))) |
ага. количество ввел сам. теперь светится. но цены не светятся)
по сути нужно что бы прайс1 стояла. |
ExXxTaSy, поправил пред предыдущий пост
|
спасибо!!!
|
Добрый день!
Если возможно подскажите как можно адаптировать код от KSA 26.06.2012, 12:05? что бы была возможность НЕ чекбоксом выбирать пункты для расчёта сумм, а через меню: <div style="position: absolute; width: 160px; height: 47px; z-index: 2; left: 10px; top: 232px" id="layer17"> <td>Темп. воздуха</td> <td> <select id="temperatura" onchange="document.location=OnChange="Rasch_Gor(\' temperatura\',this.options[this.selectedIndex].value" title="Температура среды"/> <option>Выберите температуру</option> <option value="1">Температура выше 0</option> if($_SESSION['temperatura']==1); <option value="2">от 0 до -5 градусов</option> if($_SESSION['temperatura']==2); <option value="3">от -5 до -10 градусов</option> if($_SESSION['temperatura']==3); <option value="4">от -10 до -15 градусов</option> if($_SESSION['temperatura']==4); <option value="5">от -15 до -20 градусов</option> if($_SESSION['temperatura']==5); <option value="6">от -20 до -25 градусов</option> if($_SESSION['temperatura']==6); <option value="7">от -25 и ниже</option> if($_SESSION['temperatura']==7); </select> </td> </div> Или направить где я могу научиться это делать самостоятельно. Благо дарю! |
Это не меню, а список, только незадача в том, что по условию в данном списке может быть только две опции. О каком выборе и расчете идет речь?
|
Спасибо за ответ!
Есть некая переменная gor_vydat, далее меню (раннее описанное) при выборе пунктов которого переменная gor_vydat должна умножаться на процент, который привязан к пункту меню. Наверное сложно описал. |
Цитата:
|
Цитата:
|
Понял. Сейчас опишу...
|
Задача такая. Необходимо руководствуясь температурой окружающей среды выдать для заправки автомобиля количество горючего в соответствии с нормой, а именно:
- если температура воздуха от 0 до -5 то к наливаемому горючему добавляется ещё 2 %; - если температура воздуха от -5 до -10 то к наливаемому горючему добавляется ещё 4 %; - если температура воздуха от -10 до -15 то к наливаемому горючему добавляется ещё 6 %... и так далее. Я пытаюсь реализовать так, что бы при выборе пункта меню на выходе я получил количество горючего, которое хранится в переменной gor_vydat ПЛЮС сверху добавляется количество по норме. |
Поскольку я начинающий, то я параллельно ищу ответ на вопрос и реализовываю его сразу. На практике лучше изучается.
|
Неизвестно Откуда на сервере берутся данные (по уму это должна быть база), но если по минимуму то достаточно массива и гораздо простого вывода списка:
<?php $arr = [2=>['title'=>'от 0 до -5 градусов', 'percent'=> 2], ...]; ?> <select id="temperatura" onchange="document.location=OnChange="Rasch_Gor(\' temperatura\',this.options[this.selectedIndex].value" title="Температура среды"/> <option>Выберите температуру</option> <option value="1" data-percent="0">Температура выше 0</option> <option value="<?=$_SESSION['temperatura']?>" data-percent="<?=$arr[$_SESSION['temperatura']]['percent']?>"><?=$arr[$_SESSION['temperatura']]['title']?></option> </select> Получить и рассчитать несложно. Но вот это onchange="document.location=OnChange="Rasch_Gor .... нечто неописуемое, и к тому же, пусть рабочее, тогда о каком расчете на клиенте идет речь? PS. Еще раз - вы понимаете, что ваш список будет содержать не все опции для выбора или нет? Случаем не значение ли ранее выбранного, хранящегося в сессии, нужно отметить в списке? |
Такой вот тип меню я взял с нета, немного адаптировал под свои требования, по сути я ещё не знаю что значит эта строка. Применил, она заработала и далее ищу ответы на вопросы. Поэтому и спрашиваю, может сменить тип выпадающего меню, что бы можно было выполнить поставленную задачу?
|
данные вводятся вручную, но записываются в базу
|
Вот таким образом и вводится
<div style="position: absolute; width: 159px; height: 47px; z-index: 2; left: 10px; top: 185px" id="layer19"> <tr> <td>Выдать горючего, л.:</td> <td><input type="text" name="vydat" size = 15 title = "Выдано горючего"></td> </tr> |
Вы не отвечаете на вопросы:
1) где нужно производить на расчет - на сервере или на клиенте? 2) если на клиенте, то почему по событию выбора в списке прописан переход? 3) что вы хотите "смудрить" со списком на сервере используя переменную в сессии? |
Установлен Денвер, dbForge и SublimeText. Сервер локальный.
|
Цитата:
Неужто вопросы непонятны? Попробуем так: а) при выборе в списке (то есть при каждом изменении в нем) выбор пользователя отправляется на сервер и там производится расчет? б) при выборе в списке рассчитывается на клиенте, а на сервер отправляется отправлением формы (submit)? Какой из вариантов требуется? |
Подскажите, здесь возможно присоединить скриншот? Я бы показал наглядно.
|
Всё увидел...
|
https://photos.google.com/search/_tr...aWbeZtHE?hl=ru
Необходимо ввести в область 1 количество горючего, при выборе в меню определённого пункта (область 2), а в области 3 отображается ТО количество горючего , которое необходимо выдать с учётом норм. |
Можно, но зачем, словами что не проще ответить? Спрашивается то простое.
Пишу все, далее думайте. Нельзя в DIV помещать TD. Пусть есть форма со списком, в котором по выбору рассчитывается нечто и отображается на клиенте как результат выбора. Данный расчет на клиенте чисто для клиента и серверу на него наплевать, ему нужен выбор клиента. То есть клиент выбрал, увидел, удовлетворился и отправил форму. Сервер по полученному значению произвел расчет и ... далее не знаю для чего. Вывод списка, что у вас, это какая-то профанация - переменная $_SESSION['temperatura'] не являясь набором может иметь только одно значение, а значит ваш список может иметь только 3 опции, так как опции выводятся по условию (и заметьте, что это у вас попытка вывода, ибо это не вывод, а сплошные ошибки), что, судя по задаче, совсем не то что нужно. Судя по "хотению" переменная $_SESSION['temperatura'] хранит ранее выбранное пользователем значение и если был выбор, то делает соответствующую опцию в списке выбранной. Но выводить список как каждую опцию отдельно, определяя выбор в списке, это не гут, вывод производится в цикле, а параметры опций определяются значениями из описанного набора. Коли у вас "руками" значит такой набор нужно описать в массиве. При этом опция <option>Выберите температуру</option> лишняя, так как опция <option value="1">Температура выше 0</option> фактически есть опция по умолчанию, то есть изначально это и есть выбор. //данные для выбора $data = [ 1 => ['title'=> 'Температура выше 0', 'percent'=>0], ['title'=> 'от 0 до -5 градусов', 'percent'=>.2], ['title'=> 'от -5 до -10 градусов', 'percent'=>.4], ['title'=> 'от -10 до -15 градусов', 'percent'=>.6], ['title'=> 'от -15 до -20 градусов', 'percent'=>.8], ['title'=> 'от -20 до -25 градусов', 'percent'=>.10], ['title'=> 'от -25 и ниже', 'percent'=>.12] ]; //вывод списка в форме (я не привожу код формы и как список располагается в ней) echo '<select name="percent" id="T">'; //если $_SESSION['temperatura'] определена (был уже выбор) и равна ключу массива данных, то опция списка будет выбрана foreach($data as $k=>$v) echo '<option data-percent="'.$v['percent'].'" value="'.$k.'" '.($_SESSION['temperatura']==$k ? 'selected' : null).'>'.$v['title'].'</option>'; echo '</select>'; Далее расчет на клиенте (код должен быть расположен ниже кода формы и элемента span в котором будет вывод расчета или ... ладно, пока опустим) <!-- в этом элементе будет отображается и сумма при расчете --> <span id="total">250</span> <script> var gor_vydat = 250; //откуда это берется вопрос, ну пусть где-то, как-то, в общем значение передано на клиента //рассчитываем по выбору document.getElementById('T').onchange = function() { document.getElementById('total').innerHTML = gor_vydat + gor_vydat * this.options[this.value-1].getAttribute('data-percent'); } </script> Пощелкал пользователь, выбрал, подходит ему, отправляет форму. Сервер принимая ее проверяет истинность данных и если ОК, производит расчет, выводит результат и опять форму, иначе какая надобность в $_SESSION['temperatura']? То есть прием формы должен быть кодом расположенным до вывода формы. if($d = (int)$_GET['percent'] AND key_exists($d, $data)) { //данные с клиента не левые, расчет $total = 250 + 250 * $data[$d]['percent']; //запомнить выбор в сессии $_SESSION['temperatura'] = $d; } Если форма должна отправляться при каждом выборе в списке, то никакого расчета на клиенте не надо (это нелогично), data атрибуты в опциях тоже не нужны, и по событию просто обновлять страницу с передачей текущего значения в списке. У меня не так много времени, чтобы вытягивать из вас по капельке, поэтому читайте, думайте и всегда отвечайте на вопросы полно. |
Ого! Большущая благодарность за проделанную работу! Приступаю к чтению и опробации! Ещё раз благодарю!
|
Понял на счёт вопросов. Буду стараться описывать ситуацию по полной! Удачи и Вам!
|
Часовой пояс GMT +3, время: 16:49. |