I recommend to use CSS classes instead of IDs that will allow you to calculate a separate row and have any numbers of rows. An example of the total sum is also provided.
$('#table').on('input', 'input:not(.sum, .total)', e => {
const $table = $(e.originalEvent.currentTarget);
const $row = $(e.target).closest('tr');
const calcSum = (elem, from) => {
const sum = [...from].reduce((sum, elem) => {
const val = parseFloat(elem.value);
return sum + (val === val ? val : 0);
}, 0) || NaN;
elem.val(sum === sum ? sum : '');
};
// calc sum of the row
calcSum($row.find('.sum'), $row.find(':not(.sum)'));
// calc total
calcSum($table.find('.total'), $table.find('.sum'));
});
<!DOCTYPE html>
<html>
<body>
<!DOCTYPE html>
<html>
<head>
<title> Example</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<table id="table">
<thead>
<tr>
<th>Input 1</th>
<th>Input 2</th>
<th>Input 3</th>
<th>Input 4</th>
<th>Input 5</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="text" class="input-box" /></td>
<td><input type="text" class="input-box" /></td>
<td><input type="text" class="input-box" /></td>
<td><input type="text" class="input-box" /></td>
<td><input type="text" class="input-box" /></td>
<td><input type="text" class="total-input" readonly /></td>
</tr>
<!-- Add more rows as needed -->
</tbody>
</table>
<script src="script.js"></script>
</body>
</html>
<script>
$(document).ready(function() {
// Function to update the total
function updateTotal(row) {
var total = 0;
var inputs = row.find('.input-box');
// Iterate through each input box in the current row
inputs.each(function() {
var value = parseFloat($(this).val());
// Check if the value is a valid number
if (!isNaN(value)) {
total += value;
}
});
// Set the total value in the last input box of the same row
row.find('.total-input').val(total);
}
// Listen for input changes on the input boxes
$('.input-box').on('input', function() {
var row = $(this).closest('tr');
updateTotal(row);
});
});
</script>
</body>
</html>
2
Answers
I recommend to use CSS classes instead of IDs that will allow you to calculate a separate row and have any numbers of rows. An example of the total sum is also provided.