@Cole1247

При нажатии на плюс значение прибавляется, при нажатии на минус убавляется. Как сделать?

Всем привет! Помогите пожалуйста с счётчиком.
Вот так он выглядит:
5bdd161a017b9610783333.jpeg
Вот так он выглядит в HTML:
<div class="style-item_count">
	<div class="style-count-minus">
		-
	</div>
	<div class="style-count-number">
		1шт
	</div>
	<div class="style-count-plus">
		+
	</div>
</div>


Можете сказать пожалуйста, как мне с помощью javascript или jQuery. Сделать так, чтобы при нажатии на плюс значение прибавлялось, а при нажатии на минус убавлялось.
Спасибо!
  • Вопрос задан
  • 571 просмотр
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Сколько предполагается таких элементов - один или несколько? Будем считать, что несколько.

Общий принцип тут такой - поймали клик по кнопке; определили, что за кнопка (т.е., как должно будет измениться значение, плюс или минус единица); от кнопки поднялись до общего предка кнопки и элемента, содержащего значение, внутри общего предка нашли элемент со значением; обновили значение.

Вариант раз - назначаем обработчики клика каждой кнопке индивидуально:

function setOnClick(selector, change) {
  function onClick({ target: t }) {
    const el = t.closest('.style-item_count').querySelector('.style-count-number');
    el.innerText = el.innerText.replace(/\d+/, m => Math.max(0, +m + change));
  }

  document.querySelectorAll(selector).forEach(n => n.addEventListener('click', onClick));
}

setOnClick('.style-count-plus', 1);
setOnClick('.style-count-minus', -1);

// или

function setOnClick(selector, change) {
  $(selector).on('click', e => {
    $(e.target)
      .closest('.style-item_count')
      .find('.style-count-number')
      .text((i, text) => `${Math.max(0, parseInt(text) + change)} шт`);
  });
}

Вариант два - делегирование, один обработчик на всех. Если не менять разметку, то

document.addEventListener('click', ({ target: t }) => {
  const change =
    t.classList.contains('style-count-plus')  ? +1 :
    t.classList.contains('style-count-minus') ? -1 :
                                                 0;
  if (change) {
    const el = t.closest('.style-item_count').querySelector('.style-count-number');
    el.innerText = `${Math.max(0, parseInt(el.innerText) + change)} шт`;
  }
});

// или

$(document).on('click', '.style-count-plus, .style-count-minus', e => {
  const $target = $(e.target);
  const change = $target.hasClass('style-count-plus') ? 1 : -1;

  $target
    .closest('.style-item_count')
    .find('.style-count-number')
    .text((i, text) => text.replace(/\d+/, m => Math.max(0, +m + change)));
});

Но если кнопкам добавить data-атрибуты, которые будут указывать, на сколько надо изменить значение, а самому значению добавить обёртку (чтобы отделить его от единиц измерения), то код можно немного упростить:

<div class="style-item_count">
  <div class="style-count-minus" data-change="-1">-</div>
  <div class="style-count-number"><span>1</span> шт</div>
  <div class="style-count-plus" data-change="+1">+</div>
</div>

document.addEventListener('click', ({ target: t }) => {
  const change = +t.dataset.change;
  if (change) {
    const el = t.closest('.style-item_count').querySelector('.style-count-number span');
    el.textContent = Math.max(0, +el.textContent + change);
  }
});

// или

$(document).on('click', '[data-change]', function() {
  $(this)
    .closest('.style-item_count')
    .find('.style-count-number span')
    .text((i, text) => Math.max(0, +text + +this.dataset.change));
});
Ответ написан
@Azperin
Дилетант
А вот тебе решение из разряда вредных советов, но рабочее

<div class="style-item_count">
  <div class="style-count-minus" onClick="this.parentNode.querySelector('.style-count-number').innerText = parseInt(this.parentNode.querySelector('.style-count-number').innerText, 10) - 1 + 'шт';">
    -
  </div>
  <div class="style-count-number">
    1шт
  </div>
  <div class="style-count-plus" onClick="this.parentNode.querySelector('.style-count-number').innerText = parseInt(this.parentNode.querySelector('.style-count-number').innerText, 10) + 1 + 'шт';">
    +
  </div>
</div>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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