Ответ 1
Сначала я вижу проблему, в вашем первом rows.each
вы затем переходите через all td, которые являются дочерними элементами rows
. Вместо этого используйте this
, чтобы ограничить его текущей текущей строкой. Кроме того, у вас нет возможностей для частей qty
и rate
, вы также смотрите все td
.
Вам может потребоваться настроить селектор как материал для выходов, поскольку я действительно не знаю ваш макет или где вы пытаетесь отобразить выходы.
var rows = $("#invoice_table tr:gt(0)"); // skip the header row
rows.each(function(index) {
var qty_input = $("td:nth-child(3) input", this);
var rate_input = $("td:nth-child(4) input", this);
$(this).children("td").each(function() { // calculate amount, vat, subtotal for row
var qty = qty_input .val();
var rate = rate_input .val();
var amount = qty * rate;
var vat = amount / 100 * 20;
var subtotal = amount;
subtotal += vat;
vat = vat.toFixed(2); // limit to two decimal places
amount = amount.toFixed(2);
subtotal = subtotal.toFixed(2);
$('#total_amount').val(amount); // output the values
$('#total_vat').val(vat);
$('#grand_total').val(subtotal);
});
});
Потенциально, однако, вы можете привязываться к событиям изменений для каждого поля ввода и выполнять только вычисления. Если вы можете редактировать свой источник, чтобы добавить еще несколько классов, вы можете сделать что-то вроде:
var inputs = $('#invoice_table tr:gt(0) td.quantity input, #invoice_table tr:gt(0) td.rate input');
var amount_inputs = $('#invoice_table tr:gt(0) td.amount input');
var vat_inputs = $('#invoice_table tr:gt(0) td.vat input');
var subtotal_inputs = $('#invoice_table tr:gt(0) td.subtotal input');
inputs.change(function() {
// Finding them this way purely so that we don't duplicate the code,
// it would be faster to separate the inputs array into their type and bind the change appropriately.
var qty = $(this).closest('tr').find('td.quantity input').val();
var rate = $(this).closest('tr').find('td.rate input').val();
var amount_input = $(this).closest('tr').find('td.amount input');
var vat_input = $(this).closest('tr').find('td.vat input');
var subtotal_input = $(this).closest('tr').find('td.subtotal input');
var amount = qty * rate;
var vat = amount / 100 * 20;
var subtotal = amount + vat;
amount_input.val(amount.toFixed(2));
vat_input.val(vat.toFixed(2));
subtotal_input.val(subtotal.toFixed(2));
update_totals();
});
function update_totals() {
var amttoal = 0;
var vattotal = 0;
var total = 0;
amount_inputs.each(function(){
amttoal += this.val();
});
vat_inputs.each(function(){
vattotal += this.val();
});
subtotal_inputs.each(function(){
vattotal += this.val();
});
$("#total_amount input").val(amttoal.toFixed(2));
$("#total_vat input").val(vattotal).toFixed(2);
$("#grand_total input").val(vattotal.toFixed(2));
}
Не уверен, что было бы быстрее или проще.