Подсчет общей суммы на 3 и более ингредиента
Привет всем, говорю сразу я только учусь JS и jQuery. Так что всем советам и замечаниям буду рад.
Мучался я долго с этим скриптом, в итоге, у меня так и не вышло сделать подсчет общей суммы для 3х и более добавленных ингредиентов (только для первых 2 осилил), при условии что все данные добавленные в любой момент могут меняться, прошу вашей помощи :thanks:
<div class="container">
<ul id="ingred"></ul>
<a href="#" class="add-contact">+ Добавить ингредиент</a>
<div id="sumAll"></div>
</div>
var sakhar = [
['Карамель', 3.11, 0, 0.001, 0.777],
['Шоколад темный', 5.64, 0.054, 0.353, 0.526]
];
var orekhi = [
['Арахис', 5.82, 0.263, 0.452, 0.097],
['Грецкий орех', 6.75, 0.138, 0.613, 0.102],
['Миндаль', 6.78, 0.186, 0.577, 0.136],
['Семя подсолнечника', 6.09, 0.207, 0.529, 0.05],
['Фундук', 7.37, 0.161, 0.669, 0.099]
];
var cats = [
[sakhar, 'Карамель, шоколад'],
[orekhi, 'Орехи']
];
var sumId = [];
var sum = [];
var sumx = [];
var total = [];
$("#ingred").on("click", "span", function () {
$(this).parent("li").remove();
$("#ingred li").children('a').first().click();
});
$('body').on('keyup', 'input', function () {
if ( sum[0] === 0 ){
sum.shift();
for ( var x in sum ){
sumx.splice(x,1, sum[x])
}
sum.unshift();
$('div#sumAll').append('<span><strong>Масса:</strong>'+sumx[0]+', <strong>кКал:</strong>'+sumx[1]+', <strong>Белки:</strong>'+sumx[2]+', <strong>Жиры:</strong>'+sumx[3]+', <strong>Углеводы</strong>:'+sumx[4]+'</span>');
} else {
sum.shift();
if ( sumId.length <= 2 ){
for ( var a in sumx ){
console.log('sumx[a]:'+sumx+' sum[a]:'+sum);
total.splice(a,1, sumx[a]+sum[a]);
total[a] = Math.floor(total[a]*100)/100;
sumx[a] = Math.floor(sumx[a]*100)/100;
sum[a] = Math.floor(sum[a]*100)/100;
}
console.log('total (sumId <= 2):'+total);
} else {
//for ( var x in sumId ){
console.log('total (sumId <= 2):'+total+' sum[a]:'+sum);
for ( var c in total ){
total.splice(c,1, total[c]+sum[c]);
total[c] = Math.floor(total[c]*100)/100;
sumx[c] = Math.floor(sumx[c]*100)/100;
sum[c] = Math.floor(sum[c]*100)/100;
}
console.log('total (else):'+total);
//}
}
sum.unshift();
$('div#sumAll span').remove();
$('div#sumAll').append('<span>Общая:<br/><strong>Масса:</strong>'+total[0]+', <strong>кКал:</strong>'+total[1]+', <strong>Белки:</strong>'+total[2]+', <strong>Жиры:</strong>'+total[2]+', <strong>Углеводы</strong>:'+total[4]+'</span>');
}
});
$('.add-contact').on("click", function () {
var id = $("#ingred").children().length; //think about it ;)
var tabId = 'item' + id;
$('#ingred').append('<li><div id="' + tabId + '"><select data-placeholder="Продукт" class="chosen-select'+id+'"></select></div><span> x </span></li>');
for ( var a in cats ){
var ne = cats[a][0];
$('<optgroup label="'+cats[a][1]+'"></optgroup>').appendTo('select');
for ( var b in ne ){
$('<option name="'+ne[b][0]+'">'+ne[b][0]+'</option>').appendTo($('optgroup[label="'+cats[a][1]+'"]'));
}
}
$('.chosen-select'+id).prepend("<option></option>");
$('.chosen-select'+id).change(function(){
//console.log('ID:'+id);
for ( var j in cats ){
var ne = cats[j][0];
for ( var i in ne ){
if ($(this).val() == ne[i][0]){
$('div#'+tabId+' p').remove();
$('div#'+tabId).append('<p><strong>Масса: </strong><input id="inp'+id+'" class="input" type="text" maxlength="4" placeholder="вес" /> гр. </p>');
$('#inp'+id).keyup(function(){
var sum0 = $(this).prop('value');
var sum1 = sum0 * ne[i][1]; sum1 = sum1.toFixed(2);
var sum2 = sum0 * ne[i][2]; sum2 = sum2.toFixed(2);
var sum3 = sum0 * ne[i][3]; sum3 = sum3.toFixed(2);
var sum4 = sum0 * ne[i][4]; sum4 = sum4.toFixed(2);
sum = [Number(id), Number(sum0), Number(sum1), Number(sum2), Number(sum3), Number(sum4)];
//console.log('sum:'+sum);
$('div#sumAll span').remove();
$('div#'+tabId+' p span').remove();
$('div#'+tabId+' p').append('<span><strong>кКал:</strong>'+sum[2]+', <strong>Белки:</strong>'+sum[3]+', <strong>Жиры:</strong>'+sum[4]+', <strong>Углеводы</strong>:'+sum[5]+'</span>');
});
return false;
} //if
} // for
} //for
}); // .chosen-select
sumId.push(id);
console.log('sumId:'+sumId);
});
|
EviLex,
нужен 1 массив по количеству инградиентов -- изначально все элементы массива 0 -- при добавке или удалениии соотвествующий элемент меняется на (вес или сразу сумму инградиета или 0) затем обход всех элементов и выдача общей суммы - и всё |
Цитата:
|
EviLex,
вы бы сами пример сделали полноценный с запуском, сейчас совершенно непонятно ни алгоритм добавления ни подсчёта |
Цитата:
|
Этот пример рабочий http://jsfiddle.net/d1wztvdp/1/, спасибо за ссылку на калькулятор, постараюсь разобраться.
|
Цитата:
Цитата:
|
$('body').on('keyup', 'input', function () {
for ( var c in total ){
total.splice(c,1, 0);
}
sum.shift();
for ( var x in sumId ){
var i = 0;
for ( var v in total ){
console.log('total:'+total+' sum:'+sum);
total[v]+=sum[v];
total[v] = Math.floor(total[v]*100)/100;
}
}
sum.unshift();
$('div#sumAll span').remove();
$('div#sumAll').append('<span>Общая:<br/><strong>Масса:</strong>'+total[0]+', <strong>кКал:</strong>'+total[1]+', <strong>Белки:</strong>'+total[2]+', <strong>Жиры:</strong>'+total[3]+', <strong>Углеводы</strong>:'+total[4]+'</span>');
});
Вот ссылка на почти рабочий вариант http://jsfiddle.net/d1wztvdp/2/ Вкратце как это все работает: В коде создается уникальный sum для каждого нового ингредиента (при нажатии на "+ Добавить ингредиент") его данные (калории и тп) меняются в зависимости от введных данных в его личный input. Первая ячейка массива sum хранит уникальный id. Теперь вопрос: Сейчас суммируются данные последнего ингредиента сами на себя, подскажите как подправить чтобы суммировались все ингредиенты? Думаю нужно как-то цикл дописать но не могу понять как это сделать в данном случае. |
=)
|
EviLex,
может в раздел работа? или попробуйте локализовать проблему - сейчас слишком много кода а результат кода накладывается на прежний результат |
Я сам учусь, спасибо, буду думать дальше.
|
EviLex,
:write:
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type='text/css'>
.container{
margin-top:10px;
width:340px;
}
ul{
margin:0;
padding:0;
}
#ingred>li{
position:relative;
list-style:none;
border:rgb(153,51,0) solid 1px;
border-radius:2px;
}
#ingred>li>span{
display:none;
cursor:pointer;
position:absolute;
right:5px;
top:0px;
color:red;
}
#ingred>li:hover>span{
display:inline-block;
}
input{
width:50px;
}
li p{
margin:0;
}
li strong{
font-size:12px;
}
#sumAll,h4{
margin:0;
padding:0;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function() {
var sakhar = [
['Карамель', 3.11, 0, 0.001, 0.777],
['Шоколад темный', 5.64, 0.054, 0.353, 0.526]
];
var orekhi = [
['Арахис', 5.82, 0.263, 0.452, 0.097],
['Грецкий орех', 6.75, 0.138, 0.613, 0.102],
['Миндаль', 6.78, 0.186, 0.577, 0.136],
['Семя подсолнечника', 6.09, 0.207, 0.529, 0.05],
['Фундук', 7.37, 0.161, 0.669, 0.099]
];
var cats = [
[sakhar, 'Карамель, шоколад'],
[orekhi, 'Орехи']
];
var arr = [' Масса: ', ' кКал: ', ' Белки: ', ' Жиры: ', ' Углеводы: '];
var opt = [];
function sum() {
var res = [0, 0, 0, 0, 0];
$("#ingred select").each(function(indx, element) {
var parent = $(this).parents("li");
var val = +parent.find("input").val() || 0;
var a = $.map(opt[this.value], function(el, i) {
res[i + 1] += +(val * el).toFixed(2);
return "<strong>" + arr[i + 1] + "</strong>" + (val * el).toFixed(2)
});
res[0] += val;
parent.find("p").html(a)
});
res = res[0] ? $.map(res, function(el, i) {
return "<strong>" + arr[i] + "</strong>" + el.toFixed(2)
}) : "";
$("#sumAll").html(res)
}
var $sel = $("<select/>", {
on: {
"change": sum
}
});
$.each(cats, function(indx, el) {
$("<optgroup/>", {
"label": el[1]
}).appendTo($sel);
$.each(el[0], function(ind, elem) {
$("<option/>", {
"val": opt.length,
text: elem[0]
}).appendTo($sel);
opt.push(elem.slice(1));
})
});
var $inp = $('<label/>').append(
$("<input/>", {
val: 1,
maxlength: "4",
placeholder: "вес",
on: {
"input": sum
}
})).prepend(" Масса: ");
$(".add-contact").click(function(event) {
event.preventDefault();
var $li = $("<li/>").appendTo("#ingred");
$sel.clone(true, true).appendTo($li);
$inp.clone(true, true).appendTo($li);
var $p = $("<p/>").appendTo($li);
var $span = $("<span/>", {
text: "x",
on: {
click: function() {
$li.remove();
sum()
}
}
}).appendTo($li);
sum()
});
});
</script>
</head>
<body>
<div class="container">
<ul id="ingred"></ul>
<a href="#" class="add-contact">+ Добавить ингредиент</a>
<h4>Всего:</h4>
<div id="sumAll"></div>
</div>
</body>
</html>
|
Мда, по сравнению с вашим кодом, мой выглядит ужасно топорным, спасибо большое, побежал вникать.
|
EviLex,
исправлено строка 111 была не на своём месте |
| Часовой пояс GMT +3, время: 20:49. |