замените
$("td.price").text()
на
$(this).closest('tr').find('td.price').text()
UPD. А вообще, давайте-ка перепишем и дополним ваш код. Вот, обновляются суммы не только в строках с input'ами, но и "итого" и "общая" тоже:
const sum = $items => $items.get().reduce((acc, n) => acc + +$(n).text(), 0);
function update($el, change) {
const $tr = $el.closest('tr');
const $count = $tr.find('.quantity-field').val((i, val) => Math.max(1, (val | 0) + change));
$tr.find('.sum').text($count.val() * $tr.find('.price').text());
$tr.nextAll('.total-tr').first().find('span').text(sum($tr
.add($tr.prevUntil('.total-tr'))
.add($tr.nextUntil('.total-tr'))
.find('.sum')
));
$table.find('.total-summ span').text(sum($table.find('.total-tr span')));
}
const $table = $('table')
.on('click', '.button-plus, .button-minus', function() {
const $btn = $(this);
update($btn, +$btn.hasClass('button-plus') || -$btn.hasClass('button-minus'));
})
.on('input', '.quantity-field', function() {
update($(this), 0);
});
$table.find('.quantity-field').trigger('input');
или, без jquery
const sum = items =>
Array.prototype.reduce.call(items, (acc, n) => acc + +n.textContent, 0);
function update(el, change) {
let tr = el.closest('tr');
const count = tr.querySelector('.quantity-field');
count.value = Math.max(1, (count.value | 0) + change);
tr.querySelector('.sum').innerText = count.value * tr.querySelector('.price').innerText;
const rows = [];
let total = tr;
for (; !(total = total.nextElementSibling).matches('.total-tr'); rows.push(total)) ;
for (; tr && !tr.matches('.total-tr'); rows.push(tr), tr = tr.previousElementSibling) ;
total.querySelector('span').innerText = sum(Array.from(rows, n => n.querySelector('.sum')));
table.querySelector('.total-summ span').innerText = sum(table.querySelectorAll('.total-tr span'));
}
const table = document.querySelector('table');
table.addEventListener('input', e => update(e.target, 0));
table.addEventListener('click', ({ target: t }) => {
const change = +t.matches('.button-plus') || -t.matches('.button-minus');
if (change) {
update(t, change);
}
});
table.querySelectorAll('.quantity-field').forEach(n => {
n.dispatchEvent(new Event('input', { bubbles: true }));
});