使用 addEventListener 删除 table 中的整行的错误

bug removing an entire row in a table using addEventListener

我需要通过单击带有标签(删除)的单元格来删除 table 中的整行,它有效,但如果我单击任何其他单元格,该行也会被删除。下面是 HTML 和 JS 代码来演示使用事件冒泡方法:

var table1 = document.querySelector("#tableOne");

table1.addEventListener("click", function(event) {
  event.preventDefault();
  event.target.parentNode.parentNode.remove();
});
<html>
<head></head>
<body>
   <table>
          <thead>
            <tr class="product">
              <td></td>
              <td>Name</td>
              <td>Amount</td>
              <td>Price</td>
              <td>Total</td>
              <td><a href="" class="removeItem">(remove)</a></td>
            </tr>
          </thead>
          <tbody id="tableOne">
            <tr class="product">
              <td><img src="imagens/tablet.jpg"></td>
              <td>Tablet miPad 18</td>
              <td>1</td>
              <td>499.99</td>
              <td class="item-total">499.99</td>
              <td><a href="" class="removeItem">(remove)</a></td>
            </tr>
            <tr class="product">
              <td><img src="imagens/phone.png"></td>
              <td>Telephone miPhone 18</td>
              <td>2</td>
              <td>199.99</td>
              <td class="item-total">399.98</td>
              <td><a href="" class="removeItem">(remove)</a></td>
            </tr>
            <tr class="product">
              <td><img src="imagens/shoe.jpg"></td>
              <td>Shoe</td>
              <td>1</td>
              <td>99.99</td>
              <td class="item-total">99.99</td>
              <td><a href="" class="removeItem">(remove)</a></td>
            </tr>
           </tbody>
          </table>
         </body>
        </html>

预期的结果是仅当我单击(删除)时才删除该行 如果我可以通过某种方式为每个 .removeItem 添加一个 EventListener,那就太好了。谢谢大家,复活节快乐!

您可以将事件过滤为仅目标为 removeItem link:

的事件
var table1 = document.getElementById('tableOne');

table1.addEventListener('click', function (event) {
  if (!event.target.classList.contains('removeItem')) {
    return;
  }

  event.target.parentNode.parentNode.remove();
  event.preventDefault();
});

但请记住,只有当 link 被点击时保证是目标时才有效,即当 link 没有元素子元素时。考虑到这个问题和 jQuery(是的,我知道),这更可靠:

$("#tableOne").on('click', ".removeItem", function (e) {
  $(this).closest(".product").remove();
  e.preventDefault();
});

如果 table 没有动态添加行,您 可以 为每个行添加事件侦听器(有疑问,但方便):

var removeLinks = document.getElementsByClassName('removeItem');

for (var i = 0; i < removeLinks.length; i++) {
  removeLinks[i].addEventListener('click', function (e) {
    this.parentNode.parentNode.remove();
    e.preventDefault();
  });
}

而且还可以带来 jQuery 便利:

function closest(className, element) {
  while (element && element.nodeType === 1) {
    if (element.classList.contains(className)) {
      return element;
    }
  }

  return null;
}

var table1 = document.getElementById('tableOne');

table1.addEventListener('click', function (e) {
  var link = closest('removeItem', e.target);
  var row = closest('product', link);

  if (!link) {
    return;
  }

  row.remove();
  e.preventDefault();
});