Как можно усовершенствовать мой примитивный код?

Всем привет. Имеются поверхностный знания jquery, но никогда не делал ничего "масштабного", сейчас возникла необходимость написать корзину, ринулся в бой)

Сделал, и вроде она кое как работает, но мне хотелось бы услышать Ваши комментарии (и нужно будет еще добавлять кнопки, а уже сложно работать с такой кучей переменных). Уверен, что большая часть кода просто бред) В общем если сможете отпишите как было бы лучше сделать.

Посмотреть можно здесь http://jsfiddle.net/zDGS4/
Вроде все прокомментировал.

И сюда еще на всякий случай скину js.
// +,- количество уникальной позиции
$(".plus").click(function() {
   var nc = parseInt($(this).parent("div").children('.count').text())+1;
   $(this).parent("div").children('.count').text(nc);
});
$(".minus").click(function() {
   var mc = parseInt($(this).parent("div").children('.count').text())-1;
   $(this).parent("div").children('.count').text(mc);
});

$(".add").click(function() {
   var th = $(this);
   var parCl = $("div[class^=item-]");
   // Получаем ид из класса
   var classNum = parseInt(th.parent(parCl).attr('class').replace(/\D+/g,""));
   // Помещяем все данные в соответствующие переменные
   var title = th.parent(parCl).children('.title').text();
   var price = parseInt(th.parent(parCl).children('.price').text());
   var count = parseInt(th.parent(parCl).children('.count').text());
   // Считаем первоначальную сумму
   var elemSumm = price*count;
   // Получаем сумму из инпута для последующего увеличения
   var mainSumm = parseInt(($("#summ").val()+0)/10);
   // Проверяем помещена ли позиция в корзину
   if($("div").is(".cart-item-"+classNum)){
      // Если да получаем колиество из уже существующего класса
      var newCount = parseInt($(".cart-item-"+classNum+" .cart-count").text());
      var countOut = count + newCount;
      $(".cart-item-"+classNum+" .cart-count").text(countOut)
      // Увеличиваем сумму
      var mainSummOut = mainSumm + elemSumm;
      $("#summ").val(parseInt(mainSummOut));
   }
   else{
      // Если нет добавляем
      $("#info").append("<div class='cart-item-"+classNum+"'><span class=\"cart-title\">"+title+"</span><span class=\"cart-price\">"+price+"</span><span class=\"cart-count\">"+count+"</span><div class=\"spoiler\"></div></div>");
      // Увеличиваем значение суммы
      var mainSummOut = mainSumm + elemSumm;
      $("#summ").val(parseInt(mainSummOut));
   }
   // Считаем и выводим количество уникальных позиций
   var blud = $("div[class^=cart-item-]").length;
   $("#blud").val(blud);
});
  • Вопрос задан
  • 4171 просмотр
Пригласить эксперта
Ответы на вопрос 5
из первой части:
function changeDelegate(diff) {
    
    return function(event) {
        var $count = $(this)
                .parent('div')
                .children('.count')
            ,
            mc = $count.text();
        $count.text(parseInt(mc, 10) + diff);
    };
}
$('.plus')
    .click(changeDelegate(1));
$('.minus')
    .click(changeDelegate(-1));
Ответ написан
aen
@aen
Keep calm and 'use strict';
Скрипт весь заверните в IIFE (function() {})();
Для parseInt() укажите систему счисления 10.
Я бы еще клики подчищал через event.stopPropagation().
Данные лучше хранить в data-* атрибутах.
Ответ написан
$(".plus").click и прочие
заменить на
$(document).on('click',".plus",function(){});

$("div").is(".cart-item-"+classNum)
заменить на
$("div.cart-item-"+classNum).length!=0

это то, что сразу бросается в глаза

$(this).parent("div").children('.count')
заменить как вы сделали с th

Ну и вообще я бы на вашем месте сделал объект блока cart-item- (например, cartItem), включающий в себя html и свойства, включающие дочерние элементы
а дальше при событии click на .add делал var newCartItem = cartItem.clone()
Ответ написан
EnChikiben
@EnChikiben
Много обращений к одному и тому же элементу, тут
th.parent(parCl)
$(".cart-item-"+classNum+" .cart-count")
$("#summ")
лучше выносить в переменную и избавляться от повторного обращение.

append лучше делать так .append( $('< div />',{"class":"cart-item-"+classNum}).... ) думаю суть ясна
Ответ написан
Комментировать
@lega
Вам нужно что-то более "высокоуровневое", например на Angular Light ваш пример работает "без js": jsfiddle.net/lega911/S6Pzx
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы