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

如何基于用户输入永久更新HTML乒乓球积分榜表格

乒乓球积分榜数据持久化解决方案:LocalStorage实现指南

核心问题解答

  • 能不能用LocalStorage实现? 完全可以,这是前端解决页面刷新数据丢失最便捷的方案,无需后端支持,纯前端即可完成。
  • 能否永久保存? LocalStorage是持久化存储,只要用户不主动清理浏览器本地存储(如清除缓存、删除站点数据),数据会一直保留在当前设备的浏览器中。但换设备或清理存储后数据会丢失;若需跨设备同步的永久存储,需搭配后端数据库。

具体实现步骤&改造代码

1. 结构化选手数据

先把选手信息整理成可存储的对象格式:

// 初始选手数据(和你硬编码的表格对应)
const initialStandings = [
  { name: "Jason", wins: 3, losses: 4 },
  { name: "Yair", wins: 18, losses: 2 },
  // 其他选手按此格式补充
];

2. 页面加载时读取存储并渲染表格

// 从LocalStorage加载数据,无数据则用初始值
function loadStandings() {
  const savedData = localStorage.getItem('pingPongStandings');
  const standings = savedData ? JSON.parse(savedData) : initialStandings;
  
  const table = document.getElementById("Standings");
  // 清空表头外的所有行
  while (table.rows.length > 1) {
    table.deleteRow(1);
  }
  
  // 遍历数据生成表格行
  standings.forEach((player, index) => {
    const row = table.insertRow();
    row.id = player.name;
    
    const nameCell = row.insertCell(0);
    nameCell.textContent = player.name;
    
    const winPercentCell = row.insertCell(1);
    winPercentCell.id = `win${index + 1}`;
    
    const winsCell = row.insertCell(2);
    winsCell.textContent = player.wins;
    
    const lossesCell = row.insertCell(3);
    lossesCell.textContent = player.losses;
  });
  
  // 计算并更新胜率
  updateScores();
}

3. 修改战绩时同步保存到LocalStorage

假设你有录入比赛的功能,这里示例一个更新选手战绩的函数:

// 更新指定选手的胜/负场
function updatePlayerRecord(playerName, addWin = 0, addLoss = 0) {
  const standings = JSON.parse(localStorage.getItem('pingPongStandings')) || initialStandings;
  const player = standings.find(p => p.name === playerName);
  
  if (player) {
    player.wins += addWin;
    player.losses += addLoss;
    // 保存修改后的数据到LocalStorage
    localStorage.setItem('pingPongStandings', JSON.stringify(standings));
    // 重新渲染表格
    loadStandings();
  }
}

4. 改造胜率计算函数

function updateScores() {
  const table = document.getElementById("Standings");
  const rows = table.rows;
  const standings = JSON.parse(localStorage.getItem('pingPongStandings')) || initialStandings;
  
  for (let i = 1; i < rows.length; i++) {
    const player = standings[i - 1];
    let percentage = "0%";
    
    if (player.wins > 0) {
      const totalGames = player.wins + player.losses;
      percentage = `${Math.round((player.wins / totalGames) * 100)}%`;
    }
    
    document.getElementById(`win${i}`).textContent = percentage;
  }
}

5. HTML结构调整

移除硬编码的选手行,由JS动态生成:

<table class="center" id="Standings">
  <tr>
    <th onclick="sortTable(0)">Player</th>
    <th onclick="sortTable(1)">Win Percentage</th>
    <th onclick="sortTable(2)">Wins</th>
    <th onclick="sortTable(3)">Losses</th>
  </tr>
  <!-- 选手行将由JS动态生成 -->
</table>

<!-- 测试按钮:给Jason增加1胜场 -->
<button onclick="updatePlayerRecord('Jason', 1)">Jason赢一场</button>

6. 页面初始化

页面加载完成后自动执行数据加载:

window.addEventListener('DOMContentLoaded', loadStandings);

额外建议

  • 可添加数据重置按钮,方便测试:
    function resetStandings() {
      localStorage.setItem('pingPongStandings', JSON.stringify(initialStandings));
      loadStandings();
    }
    
    对应HTML:<button onclick="resetStandings()">重置积分榜</button>
  • 若需跨设备共享数据,建议搭配轻量后端服务(如Firebase实时数据库),LocalStorage仅支持单设备存储。
  • LocalStorage存储上限约5MB,完全满足乒乓球选手数据的存储需求。
  • 每次修改数据后务必调用localStorage.setItem保存,避免数据丢失。

内容的提问来源于stack exchange,提问作者Goort

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:27