【发布时间】:2021-12-29 11:58:22
【问题描述】:
我正在使用 jQuery 动态构建一个表,并且我想在单击该行上的删除按钮时从数组中删除该项目。我目前的方法是将数据 id 设置为等于当前数组索引,然后将该值与 splice() 方法一起使用。
此时删除按钮删除一个或多个项目,最后一个项目不会被删除,因为它表示“索引”未定义。
我是 JavaScripr 和 jQuery 的新手,因此我们将不胜感激任何见解和帮助。
这是我的代码。
$('.shoppingCart').ready(function loadCart() {
// Check to see if cart has items loaded
if (sessionStorage.getItem('cartItemsLoaded' === null)) {
sessionStorage.setItem("shopCart", JSON.stringify(cart));
sessionStorage.setItem("cartItemsLoaded", true);
} else {
// Retrieve array from sessionStorage
cart = JSON.parse(sessionStorage.getItem("shopCart"));
cart = cart !=null ? cart : [];
// Declare iterator
let cartItems;
// Loop over array objects with forEach and create <tr> for each object.
$.each(cart, function (index, value) {
// Create <tr> element to hold items
cartItems = $("<tr>" +
"<td>" + value.prod + "</td>" +
"<td>R" + value.price + "</td>" +
"<td>" + "<input type='number' class='form-control border border-dark rounded' id='qntCount' data-name=" + value.prod + " value='" + value.count + "'>" + "<label class='form-label' for='qntCount'>Qnt</label>" + "</td>" +
"<td>" + "<div class='form-group'>" + "<input type='text' inputmode='numeric' class='form-control-plaintext border border-dark rounded' id='total' data-name=" + value.prod + " value='" + value.count * parseFloat(value.price) + "' disabled>" + "<label class='input-label' for='total'>Total</label>" + "</div>" + "</td>" +
"<td>" + "<button class='btn btn-outline-danger removeBtn' data-id=' " + index + " '>" + "<i class='bi bi-cart-dash'></i>" + "</button>" + "</td>" +
"</tr>");
// Used to check value of data-id.
let i = $('.removeBtn').data('id');
console.log(i);
// Add eventListener to removeBtn
$(".removeBtn").on('click', function removeProd() {
let i = parseInt($(this).data('id'));
// Remove object from cart at selected index
cart.splice(i, 1);
// Store current cart array
sessionStorage.setItem("shopCart", JSON.stringify(cart));
// Reload page
location.reload();
});
$("#shpCart").append(cartItems);
console.log(i);
$("#shpCart").show();
})
}
$(".cartTotal").html(cartTotal());
});
【问题讨论】:
-
您在每次迭代中都绑定了事件。所以第一个按钮将添加大量事件......它不会执行最后一个,因为您在元素添加到页面之前绑定事件!
标签: javascript jquery arrays dynamic