【问题标题】:Delete rows in a table using JS使用JS删除表中的行
【发布时间】:2017-01-23 11:06:04
【问题描述】:

我创建了一个在onclick 事件之后自动创建新行的表。代码还创建了一个按钮,当它被点击时删除行。

我无法解决的问题是,当我第二次单击“添加行 onclick 事件”时,我得到了同一行的两个副本。

提前感谢任何可以帮助我的人,您可以在下面找到代码:

function deleteRow(r) {
  var i = r.parentNode.parentNode.rowIndex;
  document.getElementById("orderedProductsTbl").deleteRow(i);
}

//this function manipulates DOM and displays content of our shopping cart
var shoppingCart = [];        
function displayShoppingCart(){
  var orderedProductsTblBody=document.getElementById("orderedProductsTblBody");
  //ensure we delete all previously added rows from ordered products table
  while(orderedProductsTblBody.rows.length>0) {
    orderedProductsTblBody.deleteRow(0);
  }

  //variable to hold total price of shopping cart
  var cart_total_price=0;
  //iterate over array of objects
  for(var product in shoppingCart){
    //add new row      
    var row=orderedProductsTblBody.insertRow();
    //add button
    var removeRow=document.createElement("Button");
    //set up button
    removeRow.innerHTML= "Delete"; 
    removeRow.setAttribute("onClick", "deleteRow(this)");                
    //create four cells for product properties 
    var cellName = row.insertCell(0);
    var cellDescription = row.insertCell(1);
    var cellPrice = row.insertCell(2);
    var cellDelete = row.insertCell(3);
    cellPrice.align="center";
    cellDescription.align ="right";
    cellDelete.align="right";
    cellName.height="40"
    cellPrice.height="40";
    cellDescription.height="40";
    cellDelete.height="40"
    //fill cells with values from current product object of our array
    cellName.innerHTML = shoppingCart[product].Name;
    cellDescription.innerHTML = shoppingCart[product].Description;
    cellPrice.innerHTML = shoppingCart[product].Price;
    cellDelete.appendChild( removeRow );
    cart_total_price+=shoppingCart[product].Price;     
  }
  //fill total cost of our shopping cart 
  document.getElementById("cart_total").innerHTML=cart_total_price;
}

function AddtoCart(name,description,price){
  //Below we create JavaScript Object that will hold three properties you have mentioned:    Name,Description and Price
  var singleProduct = {};
  //Fill the product object with data
  singleProduct.Name=name;
  singleProduct.Description=description;
  singleProduct.Price=price;
  //Add newly created product to our shopping cart 
  shoppingCart.push(singleProduct);
  //call display function to show on screen
  displayShoppingCart();
}

【问题讨论】:

标签: javascript jquery


【解决方案1】:

当您调用 AddtoCart 时,您将元素添加到数组 shoppingCart,但当您删除行时,您只是删除了 DOM 元素,但有关您的项目的信息仍在该数组中。

所以你也必须从数组中删除它:

function deleteRow(r) {
    var i = r.parentNode.parentNode.rowIndex;
    document.getElementById("orderedProductsTbl").deleteRow(i);
    shoppingCart.splice(i, 1); //http://stackoverflow.com/questions/5767325/how-to-remove-a-particular-element-from-an-array-in-javascript
}

编辑

而且此修复不会帮助您解决每次添加相同产品的问题。因此,您可以在每次调用 displayShoppingCart 时清除 shoppingCart 数组或重写您的算法以不使用数组在其中存储产品信息。

【讨论】:

  • 亲爱的斯拉维克,感谢您的快速回复!我尝试将您编辑的代码添加到我的代码中,但我又遇到了一些问题。我应该重写我的代码吗?感谢您的帮助!
  • @FedericoCurtoni 尝试在displayShoppingCart 的末尾插入shoppingCart = [] 并且不要使用以前的修复shoppingCart.splice(i, 1);
  • 谢谢!现在它完美地工作了!再次感谢您,祝您有美好的一天!
  • @FedericoCurtoni 但请考虑一下它为什么有效并重写您的代码 =)
  • 我认为是因为您“清除”了数组并重置了它?显然我会继续学习 JS 并改进我的代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多