@olya_097

Можно ли это как то упростить?

Ведь многое повоторяется

к примеру recount_single
и recount_basket_product

https://jsfiddle.net/dmwtnu84/
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
Ок, если вам не интересно просто подумать, то примерно так:

function recountItem(el_summ, el_quantity, n_price, e) {
  action = e ? e.target.className.match(/\w+_+(\w+)/)[1] : '';
  n_quantity = parseInt(el_quantity.text());
  switch(action){
    case 'plus':
    case 'increment':
      n_quantity ++;
      break;
    case 'minus':
    case 'decrement':
      n_quantity = n_quantity > 1 ? n_quantity - 1 : n_quantity;
      break;
  }
  el_quantity.text(n_quantity);
  el_summ.text(n_quantity * n_price + ' грн.');
};

//order

$('.order__block').each(function() {
  var $e = $(this),
      el_quantity = $e.find('.order__value'),
      el_summ = $e.find('.order__sum'),
      n_price = $e.find('.order__value').attr('data-number');

  $e.find('.order__plus').click(function(e) {
    recountItem(el_summ, el_quantity, n_price, e)
  });

  $e.find('.order__minus').click(function(e) {
    recountItem(el_summ, el_quantity, n_price, e)
  });

  recountItem(el_summ, el_quantity, n_price);
});

//single

$('.single__row').each(function() {
  var $e = $(this),
      el_quantity = $e.find('.single__count'),
      el_summ = $e.find('.single__price'),
      n_price = $e.find('.single__count').attr('data-price');

  $e.find('.single__increment').click(function(e) {
    recountItem(el_summ, el_quantity, n_price, e)
  });

  $e.find('.single__decrement').click(function(e) {
    recountItem(el_summ, el_quantity, n_price, e)
  });

  recountItem(el_summ, el_quantity, n_price);
});

//basket

$('.basket__item').each(function() {
  var $e = $(this),
      el_quantity = $e.find('.basket__value> span'),
      el_summ = $e.find('.basket__sum'),
      n_price = $e.find('.basket__single').text();

  $e.find('.single__increment').click(function(e) {
    recountItem(el_summ, el_quantity, n_price, e);
    updateBasketTotalSum();
  });

  $e.find('.single__decrement').click(function(e) {
    recountItem(el_summ, el_quantity, n_price, e);
    updateBasketTotalSum();
  });

  recountItem(el_summ, el_quantity, n_price);
  updateBasketTotalSum();
});

function updateBasketTotalSum() {
  var sum = 0;
  $('.basket__sum').each(function() {
     sum += parseInt($(this).text());
   });
  $('.basket__count').text(sum + ' грн.');
}

$('.basket__close').on('click', function() {
  $(this).parent().parent().remove();
});


если нигде в синтаксисе не ошибся, то должно работать вроде как.

PS: все повторяющиеся действия вынесены в ОДНУ функцию, тем более что у вас во все функции передавались ссылки на html элементы и действия абсолютно одинаковые. А action определяется по className элемента, который берется из event'а

PPS: только какой профит с готового решения??
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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