Why is .append() creating 2 identical rows in this code when I click Add New button? I don’t see why 2 appends happen. Am I misunderstanding something? This doesn’t happen with vanilla javascript but happens with jquery.
I added the table which includes the tbody tag at the end of the table where I would like to append the template string in function onAddProduct(e).
(Note: I removed html since it was an assignment.)
here is the code snippet
$(function() {
var $formEl = $('form');
var $tbodyEl = $('tbody');
var $tableEl = $('table');
function onAddProduct(e) {
e.preventDefault();
var $pName = $('#pname').val();
var $pCat = $('#pcat').val();
var $pPrice = $('#pprice').val();
$tbodyEl.append(`
<tr>
<td>${$pName}</td>
<td>${$pCat}</td>
<td>${$pPrice}</td>
<td><button class="deleteBtn">Delete</button></td>
</tr>
`);
}
function onDeleteRow(e) {
if (!e.target.classList.contains("deleteBtn")) {
return;
}
const btn = e.target;
btn.closest("tr").remove();
}
//formEl.addEventListener("submit", onAddProduct);
$formEl.on({
submit: onAddProduct
});
//tableEl.addEventListener("click", onDeleteRow);
$tableEl.on({
click: onDeleteRow
});
});
2
Answers
Consider the following.
I am not able to replicate the issue with this code. Only 1 Row is added.
Your table is missing the
<tbody>
around the rows you have added, so the browser is adding it in to create a valid table. This results in 2<tbody>
elements, and is why rows are being added twice:It can be prevented by putting the header and body rows inside the
<thead>
and<tbody>
elements that the browser wants, seen below in the snippet –