Вы должны использовать событие input , чтобы внести немедленные изменения для вывода результата.
Я подумаю, что решение отличается от вашего.
Сначала вы можете настроить таргетинг на все входы с классом formA и formB , используя querySelectorAll()
. Затем l oop через них присоединить событие ( input ), используя forEach()
и addEventListener()
. Внутри функции обработчика событий вы можете указывать только указанные c входы, связанные с текущим элементом. Вы можете найти их сумму, используя map()
и reduce()
. Наконец, сохраните сумму в соответствующем элементе.
var inputs = document.querySelectorAll('.formA, .formB');
Array.from(inputs).forEach(function(el){
el.addEventListener('input', function(){
var group = this.closest('div').querySelectorAll('[class^=form]');
var sum = Array.from(group).map(i => Number(i.value)).reduce((a,c) => a+c,0);
this.closest('div').querySelector('[name=total]').value = sum;
});
});
<form id="forms">
<div class="form-a">
<p>Form A</p>
input1 : <input class="formA form-1" type="text" name="qty1"/><br>
input2 : <input class="formA form-2" type="text" name="qty2"/><br>
input3 (total) : <input class="total-1" type="text" name="total" id="total"/>
</div>
<hr>
<div class="form-b">
<p>Form B</p>
input4 : <input class="formB form-3" type="text" name="qty3"/><br>
input5 : <input class="formB form-4" type="text" name="qty4"/><br>
input6 (total) : <input type="text" name="total" id="total2"/>
</div>
<input type="reset" value="Reset">
</form>