javascript - 使用计算 Js 动态添加和删除行
问题描述
我想要一个用户可以添加和删除行的表单。添加输入后,各个字段将通过乘以 qty * cost 以及底部总字段来更新。
由于我是 js 新手,因此我使用了以前答案中的代码
但是,删除功能不起作用。
我尝试了其他解决方案,但是当一行被删除时,值不会更新。
最终目标是让用户使用表创建报价并使用 ajax 将其发布到 mysql 数据库。
因此,我将 querySelectorAll 更改为一个类,例如 class=qty,因为不允许有多个相同的 id。
以下是我到目前为止所拥有的。
表格:
<form name="add_name" id="add_service">
<table id="dataTable" class="form" border="1">
<tbody>
<tr id='row_0'>
<td>
<label>Service</label>
<input type="text" required="required"
name="service[]">
</td>
<td>
<label>Quantity</label>
<input type="text" class="qty" required="required"
name="qty[]" oninput="calculate('row_0')">
</td>
<td>
<label for="price">Price</label>
<input type="text" class="cost" required="required"
name="cost[]" oninput="calculate('row_0')">
</td>
<td>
<label for="total">Total</label>
<input type="text" class="subtotal"
required="required" name="subtotal[]">
</td>
<!--<td>
<a class="remove" href="#">Remove</a>
</td>-->
</tr>
</tbody>
</table>
<div>
<input type="text" class="" id="grand_total">
</div>
<input type="button" name="submit" id="submit" class="btn btn-
info" value="Submit"/>
</form>
<script>
$(document).ready(function () {
/**$('table').on('click', 'tr a.remove', function (e) {
e.preventDefault();
$(this).closest('tr').remove();
});*/
//submit data
$('#submit').click(function () {
$.ajax({
url: "push.php",
method: "POST",
data: $('#add_service').serialize(),
success: function (data) {
alert(data);
$('#add_service')[0].reset();
}
});
});
});
function addRow(tableID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
if (rowCount < 10) {
var row = table.insertRow(rowCount);
var colCount = table.rows[0].cells.length;
row.id = 'row_' + rowCount;
for (var i = 0; i < colCount; i++) {
var newcell = row.insertCell(i);
newcell.outerHTML = table.rows[0].cells[i].outerHTML;
}
var listitems = row.getElementsByTagName("input")
for (i = 0; i < listitems.length; i++) {
listitems[i].setAttribute("oninput", "calculate('" +
row.id + "')");
}
} else {
alert("Maximum 10.");
}
}
function calculate(elementID) {
var mainRow = document.getElementById(elementID);
var myBox1 = mainRow.querySelectorAll('[class=qty]')[0].value;
var myBox2 = mainRow.querySelectorAll('[class=cost]')[0].value;
var total = mainRow.querySelectorAll('[class=subtotal]')[0];
var myResult1 = myBox1 * myBox2;
total.value = myResult1;
grandtotal();
}
function grandtotal(){
//calculation script
var $form = $('#add_service'),
$sumDisplay = $('#grand_total');
var $summands = $form.find('.subtotal');
var sum = 0;
$summands.each(function ()
{
var value = Number($(this).val());
if (!isNaN(value)) sum += value;
});
$sumDisplay.val(sum);
}
</script>
解决方案
从问题中不清楚如何addRow
被调用。我假设它是由事件触发的。您将需要取消注释删除td
并设置值onclick
:
<td>
<input type="button" class="remove" value="Remove" onclick="removeRow('dataTable', '0');">
</td>
并修改addRow
如下:
function addRow(tableID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
if (rowCount < 10) {
var row = table.insertRow(rowCount);
var colCount = table.rows[0].cells.length;
row.id = 'row_' + rowCount;
for (var i = 0; i < colCount; i++) {
var newcell = row.insertCell(i);
newcell.outerHTML = table.rows[0].cells[i].outerHTML;
}
var listitems = row.getElementsByTagName("input")
for (i = 0; i < listitems.length - 1; i++) {
listitems[i].setAttribute("oninput", "calculate('" +
row.id + "')");
}
listitems[listitems.length - 1].setAttribute("onclick", "removeRow('dataTable', " + row.id + ")");
} else {
alert("Maximum 10.");
}
}
这应该会导致生成您的删除。但是我们有一个 ids 的问题,因为如果你删除了第二行并且有第三行,那么你指定 ids 的方式将导致重复的 ids。因此,如果您删除一个项目,则必须减少后续行的 id。让我们实现removeRow
:
function removeRow(tableID, index) {
//Removing the row
var table = document.getElementById(tableID);
table.deleteRow(index);
//Modifying the ids of subsequent rows
var rowCount = table.rows.length;
for (var i = index; i < rowCount; i++) {
table.rows[i].id = "row_" + i;
}
//Handling the counts
grandtotal();
}
该代码未经测试,如果您对它有任何问题,我建议您创建一个 JSFiddle,这样我就可以轻松测试我编写的代码。
推荐阅读
- c++ - 读取检测文件中最后一个字段的 CSV 文件
- c# - 基于范围过滤行的 DataTable Rowfilter 语法
- mysql - 将一次性付款转换为交易
- apache-pig - 如何在 Pig 中找到没有 UDF 的包和元素的交集?
- dart - 如何在 Flutter 中更改状态栏颜色?
- python - pytorch 中自定义数据集的数据预处理(transform.Normalize)
- c - 如何在C中找到前两位数字
- go - 如何正确处理 runtime.Caller(0) 上的错误
- java - 在 IntelliJ IDEA 中创建文件夹以对包中的作品进行分组
- c# - 如何为删除的文件编写单元测试