当前位置:首页 > 文章列表 > 文章 > 前端 > HTML账单页面制作教程完整版

HTML账单页面制作教程完整版

2026-04-24 17:12:50 0浏览 收藏
本文深入剖析了纯HTML在构建可操作账单页面时的根本局限——它仅能静态展示,无法实现增删条目、实时计算总额或持久保存数据;真正的功能必须依赖JavaScript驱动,并结合localStorage实现本地存储与动态交互。文章以50行内可运行的精简代码为例,手把手演示如何用HTML+内联JS打造具备添加、删除、自动求和及刷新不丢数据的实用账单页,同时直击新手高频踩坑点(如NaN错误、索引错乱、函数未定义等),揭示前端开发中“结构、逻辑、状态”三层分工的本质:HTML只是渲染的表皮,而数据处理与用户交互,永远需要JavaScript来赋予生命。

HTML怎么做账单页面_HTML账单消费记录页面实现【完整版】

纯 HTML 无法实现动态账单页面——它没有数据存储、计算或交互能力,所谓“HTML 账单页面”实际是静态展示,真要记录消费、增删条目、算总额,必须配合 JavaScript;若还要持久保存(比如刷新不丢数据),就得加 localStorage 或后端。

为什么单用 HTML 写不了可操作的账单页

HTML 只负责结构:你能用

列出几条“示例消费”,但无法做到:

  • 用户点击“添加”就插入新行——HTML 没有事件响应机制
  • 输入金额后自动累加到“总计”——HTML 不会解析数字、不支持表达式
  • 删掉某笔支出,“总计”实时更新——没脚本,DOM 就是死的
  • 关掉页面再打开,数据还在——HTML 文件本身不存状态

所以市面上所有标榜“HTML 账单页面”的成品,背后都藏着 JavaScript,只是新手常误以为“写完 .html 文件就能跑”。

最简可行账单页:HTML + 内联 JavaScript

不引入框架、不连后端,50 行内搞定带增删、计总、本地保存的账单页。关键不是“多好看”,而是“能干活”:

<table id="billTable">
  <thead><tr><th>日期</th><th>项目</th><th>金额</th><th>操作</th></tr></thead>
  <tbody></tbody>
</table>
&lt;input type=&quot;date&quot; id=&quot;dateInput&quot;&gt;
&lt;input type=&quot;text&quot; id=&quot;itemInput&quot; placeholder=&quot;餐饮/交通...&quot;&gt;
&lt;input type=&quot;number&quot; id=&quot;amountInput&quot; step=&quot;0.01&quot;&gt;
<button onclick="addRecord()">添加</button>
<p>总计:<span id="total">0.00</span> 元</p>

<script>
  const records = JSON.parse(localStorage.getItem('bills')) || [];
  function render() {
    document.querySelector('#billTable tbody').innerHTML = records.map((r, i) =>
      <tr><td>${r.date}</td><td>${r.item}</td><td>${r.amount}</td><td>
        <button onclick="delRecord(${i})">删</button>
      </td></tr>
    ).join('');
    document.getElementById('total').textContent = records.reduce((s, r) => s + parseFloat(r.amount), 0).toFixed(2);
  }
  function addRecord() {
    const d = document.getElementById('dateInput').value || new Date().toISOString().split('T')[0];
    records.push({
      date: d,
      item: document.getElementById('itemInput').value,
      amount: document.getElementById('amountInput').value || '0'
    });
    localStorage.setItem('bills', JSON.stringify(records));
    render();
  }
  function delRecord(i) {
    records.splice(i, 1);
    localStorage.setItem('bills', JSON.stringify(records));
    render();
  }
  render();
</script>

注意点:

  • localStorage 只存字符串,必须用 JSON.stringify / JSON.parse 转换
  • parseFloat 防止金额拼接成字符串(如 "10"+"5""105"
  • 日期控件在部分旧浏览器(如 IE)不生效,fallback 用 new Date().toISOString() 自动生成
  • 删除用索引而非 ID——因为没后端,数组下标就是最直接的唯一标识

常见报错和修复点

照着抄却跑不起来?大概率卡在这几个地方:

  • 控制台报 Uncaught ReferenceError: addRecord is not defined:函数定义位置错了,