将 .data() 属性设置为等于数组索引

Set .data() attribute equal to array index

我正在用 jQuery 动态构建一个 table,我想在该行上单击删除按钮时从数组中删除该项目。我当前的方法是将数据 ID 设置为等于当前数组索引,然后将该值与 splice() 方法一起使用。

目前删除按钮删除一个或多个项目,最后一个项目不会被删除,因为它说 'index' 未定义。

我是 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());

});

您将事件绑定到每次迭代的所有按钮。在将按钮添加到 DOM 之前绑定事件,因此它找不到最后一个。

大声朗读代码

  • 循环开始
  • 构建 TR (1)
  • Select 页面上的所有 removeBtn 并添加事件(什么也没找到)
  • 添加第 (1) 行
  • 显示购物车
  • 下一次迭代
  • 构建 TR (2)
  • Select 页面上的所有 removeBtn 并添加事件(找到 1 个)
  • 添加第 (2) 行
  • 显示购物车
  • 下一次迭代
  • 构建 TR (3)
  • Select 页面上的所有 removeBtn 并添加事件(找到 1、2)
  • 添加第 (3) 行
  • 显示购物车

所以有 3 行。

  • 第一个按钮附加了 2 个点击事件
  • 第二个按钮附加了 1 个点击事件
  • 第三个按钮附加了 0 个点击事件

您需要在添加所有行后绑定事件

$.each(cart, function (index, value) {
  // add the rows
});
$(".removeBtn").on('click', function {});