Добавление / удаление значений в массив
Здравствуйте. Уже обращался на форум, но теперь мне нужно немного переделать старый скрипт. Кратко о том что нужно:
Есть у меня список ингредиентов - "ing_list" Есть две кнопки "ing_add", различаю их по атрибуту data('opetarion') есть МИНУС и ПЛЮС; Есть счетчик ингредиентов count_ing и массив ингредиентов ingredients и цена каждого из ингредиентов ing_price. Вот сам код:
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(document).ready(function(){
var ing_list = $('.add_ing_list li'),
ing_add=ing_list.find('span.add_new_ing'),
count_ing = 0,//счетчик ингредиентов
ingredients='',//массив ингредиентов
ing_price = 0;//общая цена ингредиентов
//нужно сделать еще счетчик цены ing_price чтобы он добавлялся или отнимался в зависимости от выполняемого действия
ing_add.click(function () {
var ing_price = $(this).data('ord');//цена ингредиента
var operation = $(this).data('operation');//операция плюс или минус
if(operation=='plus'){
if($(this).parent('li').hasClass('added_to_list')){
count_ing++;
$(this).parent('li').find('span.count_ing').text('+'+count_ing+' ');
ingredients = $.map($($(this).parent('li.added_to_list')),function(el) {
return $(el).text()
});
}else{
count_ing=$(this).parent('li').find('span.count_ing').text();
count_ing++;
$(this).parent('li').addClass('added_to_list');
$(this).parent('li').find('span.count_ing').text('+'+count_ing+' ');
ingredients = $.map($($(this).parent('li.added_to_list')),function(el) {
return $(el).text()
});
}
} else if(operation=='minus'){
count_ing--;
if($(this).parent('li').hasClass('added_to_list')){
if(count_ing<=0){
$(this).parent('li').removeClass('added_to_list');
$(this).parent('li').find('span.count_ing').text('');
count_ing=0;
ingredients = $.map($($(this).parent('li.added_to_list')),function(el) {
return $(el).text('')
});
}else{
$(this).parent('li').find('span.count_ing').text('+'+count_ing+' ');
ingredients = $.map($($(this).parent('li.added_to_list')),function(el) {
return $(el).text()
});
}
}else{
return false;
}
} else {
return false;
}
alert(ingredients)
});
});
</script>
</head>
<body>
<div class="pizza_add_ing">
<ul class="add_ing_list">
<li data-ord="10" data-id="1">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Сыр
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
<li data-ord="15" data-id="2">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Томаты
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
<li data-ord="20" data-id="3">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Курица
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
</ul>
</div><!-- .pizza_add_ing -->
</body>
</html>
Что мне нужно и что у меня получается: Когда я нажимаю на ПЛЮС возле названия ингредиента появляется количество, и добавляется класс "added_to_list", в массив ингредиентов должно заноситься значение, то есть весь текст родительского элемента <li> когда нажимаю на МИНУС, количество уменьшается и из массива должно удалиться то количество которое удалили или вообще удалить из массива данный ингредиент, если количество равно = 0. Сейчас у меня следующие проблемы: 1) когда я добавляю несколько разных ингредиентов, у меня счетчик сбивается. То есть, допустим я добавил +3 сыр, +3 томаты, +7 курицы, и когда я нажму на кнопку ПЛЮС чтобы добавить сыр, счетчик посчитает уже +8 сыр. то есть возьмет последнее значение которое я добавил и добавит +1, то есть последнее было +7 курицы, сыр станет +8. 2)Когда я добавляю элементы в массив, они просто перезаписываются в место уже имеющихся 3)Когда я отминусую все элементы - текст <li> вообще пропадает. Надеюсь поймете :)) Спасибо |
Как вариант...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
$('.add_new_ing').click(function(){
var n=($(this).data('operation')=='minus')? -1: 1;
var o=$(this.parentNode);
var ocnt=o.find('.count_ing');
var val=+ocnt.text();
val=val+n;
if (val<1) {
o.remove();
return;
};
ocnt.text(val);
});
})
</script>
</head>
<body>
<div class="pizza_add_ing">
<ul class="add_ing_list">
<li data-ord="10" data-id="1">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Сыр
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
<li data-ord="15" data-id="2">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Томаты
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
<li data-ord="20" data-id="3">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Курица
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
</ul>
</div>
</body>
</html>
|
калькулятор продуктов и сумма
rostik1991,
:(
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.add_new_ing {
cursor: pointer;
margin: 0 4px;
}
li .add_ing_minus {
visibility: hidden;
}
li.added_to_list .add_ing_minus {
visibility: visible;
}
li{
list-style-type: none;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function() {
var ing_list = $(".add_ing_list li"),
ing_add = ing_list.find("span.add_new_ing"),
count_ing = {},
ingredients = [],
ing_price = 0,
ing_text = {1 : 'Сыр',2 : 'Томаты', 3 : 'Курица'};
ing_list.each(function(indx, li) {
li = $(li);
li.on("click", "span.add_new_ing", function(event) {
event.preventDefault();
var add = $(this).data("operation") == "plus" ? 1 : -1;
var id = li.data("id");
var count = (count_ing[id] || 0) + add;
count < 0 && (count = 0);
count_ing[id] = count;
$("span.count_ing",
li).text(count ? count + " " : "");
li.toggleClass("added_to_list", !!count);
ingredients = [];
ing_price = 0;
$.each(ing_list, function(i, li) {
li = $(li);
var id = li.data("id");
var count = count_ing[id] || 0;
var price = li.data("ord");
if (count) {
ingredients.push(count + " " + ing_text[id]);
ing_price += price * count
}
});
$("p").html(ingredients + '<br>Итого: ' + ing_price)
})
})
});
</script>
</head>
<body>
<div class="pizza_add_ing">
<ul class="add_ing_list">
<li data-ord="10" data-id="1">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Сыр
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
<li data-ord="15" data-id="2">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Томаты
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
<li data-ord="20" data-id="3">
<span class="add_new_ing add_ing_minus" data-operation="minus">-</span>
<span class="count_ing"></span>Курица
<span class="add_new_ing add_ing_plus"data-operation="plus">+</span>
</li>
</ul>
</div><!-- .pizza_add_ing -->
<p></p>
</body>
</html>
|
К сожалению этот вариант вообще не подходит. Мне нужно отслеживать и добавлять значения именно в момент нажатия, и именно по конкретному элементу. Так как все ингредиенты и цены я достаю из базы через PHP, Ваш же вариант работает только здесь :-? :(
|
Цитата:
|
Цитата:
|
Цитата:
|
Все данные сохраняются в ing.ingridients т.е. твой массив.
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(document).ready(function(){
setObj = Object.defineProperty;
ing = {
ingridients: {},
action: {},
run: function() {
this.clickWacher();
},
clickWacher: function() {
var _this = this;
$(".ing_change").click(function() {
_this.collectData(this);
_this.calculate();
_this.populateData();
_this.changeCounter(this);
});
},
collectData: function(elem) {
this.action = {
ingridient: $(elem).parent().data('ing'),
price: $(elem).parent().data('price'),
change: $(elem).text(),
label: $(elem).parent().find('.ing_label').text()
}
},
calculate: function() {
if (!this.ingridients[this.action.ingridient]) {
var i = this.action.change == "+" ? 1 : 0 ;
setObj(this.ingridients, this.action.ingridient, {
value: {
price: this.action.price,
num: i,
label: this.action.label
}
});
}
else if (this.ingridients[this.action.ingridient].num > 0 || this.action.change == "+") {
this.ingridients[this.action.ingridient].num += this.action.change == "+" ? 1 : -1 ;
this.ingridients[this.action.ingridient].price = this.action.price * this.ingridients[this.action.ingridient].num ;
}
},
populateData: function() {
if (this.ingridients[this.action.ingridient].num > 0) {
if ($('#' + this.action.ingridient).length == 0) $('.stat').append('<p id="' + this.action.ingridient + '"></p>');
$('#' + this.action.ingridient).text("Ингридиент: "+ this.action.label + " " + this.ingridients[this.action.ingridient].num
+ "шт. " + this.action.price + "$. Сумма: " + this.ingridients[this.action.ingridient].price + "$");
}
else $("#" + this.action.ingridient).remove();
},
changeCounter: function(elem) {
var counter = $(elem).parent().find('.ing_num').text(": " + this.ingridients[this.action.ingridient].num);
}
}
ing.run();
});
</script>
</head>
<body>
<div class="pizza_add_ing">
<ul class="add_ing_list">
<li data-ing="cheese" data-price="10">
<span class="ing_change">-</span>
<span class="ing_label">Сыр</span><span class="ing_num">: 0</span>
<span class="ing_change">+</span>
</li>
<li data-ing="tomato" data-price="15">
<span class="ing_change">-</span>
<span class="ing_label">Томаты</span><span class="ing_num">: 0</span>
<span class="ing_change">+</span>
</li>
<li data-ing="chicken" data-price="20">
<span class="ing_change">-</span>
<span class="ing_label">Курица</span><span class="ing_num">: 0</span>
<span class="ing_change">+</span>
</li>
</ul>
<div class="stat"></div>
</div>
<style>
.ing_change {
background: #558b2f;
color: #ffffff;
font-weight: bold;
cursor: pointer;
width: 25px;
display: inline-block;
text-align: center;
line-height: 25px;
}
li {
margin-bottom: 15px;
list-style: none;
}
.ing_label {
width: 55px;
display: inline-block;
}
.ing_num {
width: 25px;
display: inline-block;
}
</style>
</body>
</html>
|
| Часовой пояс GMT +3, время: 10:47. |