Как я понимаю, при клике я каждый раз вызываю функцию и переменная val опять принимает значение равное нулю?
Не совсем так. При каждом клике создаётся ещё один экземпляр val, подключаются ещё по одному обработчику клика к
.value-btn-plus
и
.value-btn-minus
, сами обработчики срабатывают в порядке подключения, поэтому в
value-text
последним будет записано значение val, к которому имеет доступ последний же подключенный обработчик - т.е. 0, или что там у вас.
Очевидно, стоит отказаться от подключения дополнительных обработчиков. Можно вообще ограничиться одним обработчиком клика для всех кнопок, а какая именно была нажата - узнавать, проверяя наличие соответствующих классов. Как-то так:
$(document).on('click', '.value-btn-plus, .value-btn-minus', function() {
const $this = $(this);
const change = $this.hasClass('value-btn-plus') ? 1 : -1;
$this
.closest('.input-box')
.find('.value-text')
.text((i, text) => Math.max(0, +text + change));
});
Или, к чёрту jquery:
document.addEventListener('click', ({ target: t }) => {
const change =
t.classList.contains('value-btn-plus') ? 1 :
t.classList.contains('value-btn-minus') ? -1 :
0;
if (change) {
const valueEl = t.closest('.input-box').querySelector('.value-text');
valueEl.innerText = Math.max(0, +valueEl.innerText + change);
}
});