You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不刷新页面的情况下避免表格出现重复元素?

解决localStorage数据渲染重复的问题

嘿,我一眼就看出问题所在了——你的save()函数每次执行时,都是把list里的所有数据追加到表格中,而不是先清除已有的旧内容。页面加载时第一次调用save()没问题,但点击新增按钮后,list已经包含了旧数据+刚新增的数据,再次调用save()就会把所有数据又重新加一遍,自然就出现重复了。

给你两种靠谱的解决方案,你可以根据需求选择:

方案一:清空表格后重新渲染(推荐,更通用)

修改你的save()函数,在渲染新数据前先把表格里已有的内容(除了表头,如果有的话)清空,然后再重新绘制所有数据。这样不管是新增、修改还是删除数据,只要调用save()就能保证表格内容和list完全同步。

修改后的save()函数代码如下:

function save() {
  var table = document.getElementById("table");
  // 先清空表格内容:优先找tbody(如果你的表格有thead+tbody结构)
  var tbody = table.querySelector('tbody');
  if (tbody) {
    tbody.innerHTML = '';
  } else {
    // 如果没有tbody,就删除所有非表头的行(假设第一行是表头)
    const existingRows = table.querySelectorAll('tr:not(:first-child)');
    existingRows.forEach(row => row.remove());
  }

  // 再重新渲染所有数据
  list.forEach(function(item) {
    var nameNode = document.createTextNode(item.name);
    var surnameNode = document.createTextNode(item.surname);
    var dataNode = document.createTextNode(item.data);
    var nrNode = document.createTextNode(item.nr);
    var tdName = document.createElement("td");
    var tdSurname = document.createElement("td");
    var tdData = document.createElement("td");
    var tdNr = document.createElement("td");
    tdName.appendChild(nameNode);
    tdSurname.appendChild(surnameNode);
    tdData.appendChild(dataNode);
    tdNr.appendChild(nrNode);
    var tr = document.createElement("tr");
    tr.appendChild(tdName);
    tr.appendChild(tdSurname);
    tr.appendChild(tdData);
    tr.appendChild(tdNr);
    
    // 把新行加到tbody或者表格里
    if (tbody) {
      tbody.appendChild(tr);
    } else {
      table.appendChild(tr);
    }
  });
}

另外,你初始获取localStorage数据的代码可以优化一下,避免重复调用localStorage.getItem:

// 替换原来的list赋值代码
var storedOsoba = localStorage.getItem("osoba");
list = storedOsoba ? jQuery.parseJSON(storedOsoba) : [];

方案二:只插入新增的那一行(适合简单场景)

如果你不想每次都清空重绘,也可以在点击新增按钮时,只把刚创建的那条数据对应的行插入到表格末尾,而不是调用整个save()。这样代码会有一点重复,但性能稍好(只操作一行)。

修改后的点击事件代码:

$("#send").click(function() {
  var osoba = {};
  osoba["name"] = document.getElementById("name").value;
  osoba["surname"] = document.getElementById("subname").value;
  osoba["data"] = document.getElementById("date_bth").value;
  osoba["nr"] = document.getElementById("numer_phone").value;
  list.push(osoba);
  localStorage.setItem("osoba", JSON.stringify(list));
  
  // 单独创建新行并添加到表格
  var nameNode = document.createTextNode(osoba.name);
  var surnameNode = document.createTextNode(osoba.surname);
  var dataNode = document.createTextNode(osoba.data);
  var nrNode = document.createTextNode(osoba.nr);
  var tdName = document.createElement("td");
  var tdSurname = document.createElement("td");
  var tdData = document.createElement("td");
  var tdNr = document.createElement("td");
  tdName.appendChild(nameNode);
  tdSurname.appendChild(surnameNode);
  tdData.appendChild(dataNode);
  tdNr.appendChild(nrNode);
  var tr = document.createElement("tr");
  tr.appendChild(tdName);
  tr.appendChild(tdSurname);
  tr.appendChild(tdData);
  tr.appendChild(tdNr);
  var table = document.getElementById("table");
  table.appendChild(tr);
  
  // 清空输入框
  document.getElementById("name").value = "";
  document.getElementById("subname").value = "";
  document.getElementById("date_bth").value = "";
  document.getElementById("numer_phone").value = "";
  // 这里不再调用save()
});

两种方案对比

  • 方案一更推荐,因为它的逻辑更统一,后续如果要加删除、编辑功能,只需要更新list然后调用save()就能自动刷新表格,不用再写额外的DOM操作代码。
  • 方案二适合只需要新增功能的简单场景,但代码有重复,后续维护成本稍高。

内容的提问来源于stack exchange,提问作者JJ.G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:27:11