Как повторно повесить обработчик на элемент?

Есть простая, тренировочная корзина. Весь код показывать не буду, так как он объёмный. Суть простая: добавляем товар в корзину, у него есть кнопки +/- для добавления и уменьшения количества товара, и есть инпут в котором можно менять количество товара как нажатием на кнопки +/-, так и менять значение вручную с клавиатуры.

С кнопками разобралась, при клике меняю количество и пересчитываю стоимость, но вот с input сложнее.

Код:

const cartCounterChange = () => {

  //находим все елементы в корзине
  const itemList = document.querySelectorAll('.cart__item');

  //проходим циклом по всем елементам 
  itemList.forEach(item => {

    //находим сам инпут
    const input = item.querySelector('[data-counter]');

    //находим обертку инпута
    const inputWrapper = item.querySelector('.product__counter-input');
    
    //на каждый инпут вешаем событие
    input.addEventListener('change', (e) => {

      //перезаписываем значение value (вот здесь я перезаписываю елемент и теряю обработчик. Перезаписываю для того, что-бы в DOM менялось количество товара, а именно атрибут value, так как с его помощью я делаю подсчет количества товаров в корзине)
      inputWrapper.innerHTML = `<input type="text" class="product__counter-quantity" placeholder="1" value="${e.target.value}" data-counter=""></input>`;

      //вызываем функию которая пересчитывает значения общей суммы
      calcCart('.shopping-cart', '.cart__item');
    });

  });
  
};

Получается что в коде я перезаписываю элемент <input> в DOM и обработчик так же теряется. Как мне заново повесить обработчик, после того как я его перезаписала? Или может это нужно делать с помощью делегирования?


Ответы (1 шт):

Автор решения: Sergey Bogdanets

Попробуйте вот так. Я проверил после события value инпута в его свойствах, оно изменилось. Вам лишь нужно сохранить потом это изменённое значение.

const inputs = document.querySelectorAll('input');

inputs.forEach(item => {
   item.addEventListener('change', (e) => {
      item.value = e.path[0].value;
      console.log(item.value);
   })
})
<input type="text" value="1" />
<input type="text" value="1" />
<input type="text" value="1" />

→ Ссылка