JavaScript实现HTML表格数据的实时计算与更新

JavaScript实现HTML表格数据的实时计算与更新

本文详细介绍了如何利用javascript事件委托机制,实现html表格中单行总价和总计的实时动态更新。通过监听父级表格的input事件,我们能够即时捕获用户在单价和数量输入框中的改动,并同步更新相应行的总价及整个订单的总价,同时包含对负数输入的处理,显著提升了用户体验。

在构建交互式网页应用时,尤其是涉及数据录入和计算的场景,如订单系统或购物车,实时反馈是提升用户体验的关键。传统的做法是让用户在输入数据后点击一个按钮来触发计算,但这往往导致操作流程繁琐且效率低下。本教程将深入探讨如何通过JavaScript事件委托技术,实现HTML表格中单行总价(Total)和总计(Grand Total)的即时动态更新,从而避免手动触发计算的需要。

传统计算方式的局限性

在许多初始实现中,计算逻辑通常封装在一个函数中,并通过按钮的onclick事件来调用。例如,以下JavaScript代码展示了一个典型的计算逻辑:

function calculateTotal() {  let rows = document.querySelectorAll("tbody tr");  let grandTotal = 0;  let negative = false;  for (let i = 0; i < rows.length; i++) {    let row = rows[i];    let quantityInput = row.querySelector(".quantity input");    let priceInput = row.querySelector(".price input");    let totalInput = row.querySelector(".total input");    let quantity = parseInt(quantityInput.value);    let price = parseFloat(priceInput.value); // 注意:toFixed(2)应该在最终显示时使用,计算时使用浮点数    if(isNaN(quantity) || quantity < 0){ // 增加对NaN的检查      negative = true;      quantity = 0;      quantityInput.value = "0";    }    if(isNaN(price) || price < 0){ // 增加对NaN的检查      negative = true;      price = 0.00;      priceInput.value = "0.00";    }    let total = quantity * price;    totalInput.value = total.toFixed(2); // 在此处格式化显示    grandTotal += total;  }  document.querySelector(".GrandTotal").value = grandTotal.toFixed(2);  if(negative){    alert("不允许输入负值!已自动重置为0。")  }}

这种方法要求用户每次更改单价或数量后,都必须点击“Calculate Grand Total Price”按钮才能看到更新后的结果。这显然不是一个理想的用户体验。

实时动态更新的实现:事件委托

为了实现实时更新,我们需要在用户输入时即刻触发计算。最有效的方法是利用事件委托(Event Delegation),将事件监听器附加到父级元素上,而不是每个单独的输入框。当事件在子元素上触发时,它会冒泡到父元素,父元素上的监听器就能捕获并处理它。

立即学习“Java免费学习笔记(深入)”;

1. HTML结构准备

首先,确保你的HTML表格结构清晰,并且包含用于单价、数量、单行总价和总计的输入字段,并赋予相应的类名以便JavaScript选择器定位。

                Book Ordering System        

Book Ordering System

No. Book Title Author Category Unit Price Quantity Total
1 Please choose the category... Business Fiction Mathematics Technology
2 Please choose the category... Business Fiction Mathematics Technology
<!-- 确保在标签前引入JS -->

请注意,我们移除了tfoot中原有的“Calculate Grand Total Price”按钮,因为我们的目标是实现自动实时更新。

2. JavaScript事件委托逻辑

我们将使用DOMContentLoaded事件来确保DOM完全加载后再绑定事件监听器,避免因元素未加载而导致的错误。然后,在整个myTable上监听input事件。当任何input元素的值发生变化时,这个事件都会触发。

// book-order.jswindow.addEventListener("DOMContentLoaded", () => {  // 当页面DOM内容加载完毕后执行  const myTable = document.getElementById("myTable");  // 绑定input事件到整个表格,利用事件委托  myTable.addEventListener("input", (event) => {    // 检查触发事件的元素是否是我们关心的单价或数量输入框    const target = event.target;    if (!target.matches('.quantity input') && !target.matches('.price input')) {        // 如果不是单价或数量输入框,则不执行计算        return;    }    let rows = document.querySelectorAll("tbody tr");    let negativeValueDetected = false; // 用于标记是否检测到负值    // 使用Array.prototype.map和Array.prototype.reduce进行更简洁的计算    let grandTotal = [...rows].map(row => {      let quantityInput = row.querySelector(".quantity input");      let priceInput = row.querySelector(".price input");      let totalInput = row.querySelector(".total input");      let quantity = parseInt(quantityInput.value);      let price = parseFloat(priceInput.value);      // 输入验证:处理非数字或负数输入      if (isNaN(quantity) || quantity < 0) {        negativeValueDetected = true;        quantity = 0;        quantityInput.value = "0"; // 重置为0      }      if (isNaN(price) || price  accumulator + currentValue, 0); // 累加所有行的总价    // 更新总计    document.querySelector(".GrandTotal").value = grandTotal.toFixed(2);    // 如果检测到负值,则弹出警告    if (negativeValueDetected) {      alert("不允许输入负值!已自动重置为0。");    }  });});

3. CSS样式(可选)

CSS部分保持不变,它主要负责表格的视觉呈现。

/* book-order.css */table,td {    padding: 0.5rem;    border: 3px solid;    border-collapse:collapse;}h1 {    font-family: 'Ubuntu', cursive;}th {    background-color: skyblue;    font-weight: bold;    padding: 0.5rem;    border: 3px solid;    border-collapse:collapse;}tbody {    background-color: white;}.No {    text-align: right;}td:nth-child(7) input[type="number"]{    text-align: right; background-color: silver;}td:nth-child(6) input[type="number"]{    text-align: right;}td:nth-child(5) input[type="number"]{    text-align: right;}tfoot tr td:last-child input[type="number"]{    text-align: right;}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button {  -webkit-appearance: none;  margin: 0;}tfoot {    font-weight: bold;}.Button { /* 此处Button类已不再需要,但保留以防其他用途 */    float:right;}.GrandTotal {    background-color: silver;    font-size: 18pt;    float:right;}tr:hover {    background-color: yellow;}.background-colour {    background-color: skyblue;}body {    background-color: lemonchiffon;}

关键改进点和注意事项

事件委托 (myTable.addEventListener(“input”, …)):

将事件监听器绑定到父元素myTable上,而不是每个quantity或price输入框。这减少了事件监听器的数量,提高了性能,尤其是在表格行数很多时。input事件在input元素的值发生变化时立即触发,提供了实时反馈。通过event.target检查事件源,确保只有单价和数量输入框的变化才会触发计算,避免不必要的计算。

DOMContentLoaded:

window.addEventListener(“DOMContentLoaded”, …)确保JavaScript代码在DOM完全加载和解析后才执行。这保证了myTable元素及其内部的输入框在尝试绑定事件和查询时是可用的。

数据类型转换和验证:

parseInt()和parseFloat()用于将输入值转换为数字。增加了对isNaN()的检查,以处理用户可能输入非数字字符的情况。对负数输入进行了处理:将其重置为0并弹出警告,这增强了数据的健壮性。

数组方法优化:

使用[…rows].map(…)将NodeList转换为数组,然后对每行执行计算并返回其总价。使用.reduce(…)方法简洁地累加所有行的总价,生成最终的grandTotal。这种函数式编程风格使代码更具可读性和维护性。

数值格式化:

toFixed(2)用于将计算结果格式化为两位小数,确保货币显示的一致性。

总结

通过采用事件委托和优化JavaScript逻辑,我们成功地将一个需要手动触发的表格计算系统改造为实时动态更新的交互式应用。这种方法不仅提升了用户体验,也展示了现代JavaScript在DOM操作和数据处理方面的强大能力和简洁性。在开发涉及大量用户输入和计算的Web界面时,实时反馈和高效的事件处理是不可或缺的考量。

以上就是JavaScript实现HTML表格数据的实时计算与更新的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1537916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Angular PrimeNG 下拉菜单禁用键盘字符选择功能教程
上一篇 2025年12月21日 04:32:56
JS函数如何定义函数循环逻辑_JS函数循环逻辑定义与循环函数结合使用
下一篇 2025年12月21日 04:33:16

相关推荐

  • 如何清理浏览器缓存_各浏览器缓存清除指南

    清理浏览器缓存是指删除浏览器为加速网页加载而存储的临时文件,如图片、css、javascript等;2. 主要目的是解决网页显示错乱、加载旧内容等问题,并释放硬盘空间;3. 操作核心是进入浏览器设置或使用快捷键,选择清除数据类型时务必勾选“缓存的图片和文件”;4. 不同浏览器操作路径略有差异:chr…

    2026年8月28日
    000
  • 手把手教你们Python配置OpenCV环境,小白看一遍就会了

    手把手教你们Python配置OpenCV环境,小白看一遍就会了手把手教你们Python配置OpenCV环境,小白看一遍就会了手把手教你们Python配置OpenCV环境,小白看一遍就会了手把手教你们Python配置OpenCV环境,小白看一遍就会了

    ?️‍?1、简介?1.1、Opecv介绍 开课之前,我们先给大家讲讲opecv是一个基于bsd许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在linux、windows、android和mac os操作系统上。 [1] 它轻量级而且高效——由一系列 c 函数和少量 c++ 类构成,同时…

    2026年8月28日 用户投稿
    300
  • CCleaner怎么设置自动清理_CCleaner自动清理功能的设置方法

    CCleaner通过“监控器”功能可在系统启动时自动提示清理垃圾文件,用户可勾选“系统启动时运行监控器”并开启通知功能,实现开机或活动后提醒清理;若需完全自动化,可结合Windows任务计划程序创建定时任务,使用“/AUTO”命令行参数让CCleaner无人值守自动清理,从而提升系统运行效率。 CC…

    2026年8月28日
    100
  • VSCode怎么建立外部样式_VSCode链接外部CSS文件方法教程

    首先创建style.css文件并编写样式,然后在HTML的head中通过link标签引入,最后用Live Server插件实现实时预览;若样式未生效,需检查路径、语法、优先级、缓存及HTML结构,并利用开发者工具调试;大型项目应按模块或页面拆分CSS,结合预处理器、BEM规范和CSS Reset提升…

    2026年8月28日
    000
  • React前端与PHP后端联调:高效定位与解决PHP错误

    本文针对React前端与PHP后端集成时,PHP错误难以追踪的问题,提供了两种高效调试策略。核心在于通过配置PHP服务器端错误日志,将详细错误信息记录到文件,以及利用浏览器开发者工具的网络面板直接检查API的原始响应,从而避免JSON解析错误并快速定位后端问题。 问题剖析:React前端下PHP错误…

    2026年8月28日
    000
  • Win10系统高对比度反转颜色如何设置?

    Win10系统高对比度反转颜色如何设置?Win10系统高对比度反转颜色如何设置?Win10系统高对比度反转颜色如何设置?Win10系统高对比度反转颜色如何设置?

    目前很多用户都在使用windows 10操作系统,新购入的电脑大多也预装了这一系统,但依然有不少人对它的使用不太熟悉,比如如何开启高对比度并反转颜色。其实操作起来非常简单,接下来就跟随小编一起来学习一下具体的步骤吧。 操作步骤如下: 首先,点击屏幕左下角的“开始”按钮。 接着,找到图标像齿轮一样的“…

    2026年8月28日 用户投稿
    100
  • 抖音网页版怎么反馈问题_抖音网页版意见反馈渠道入口

    最有效反馈方式是通过手机App提交。打开抖音App,进入“我”页面,点击右上角“⋯”,选择“反馈与帮助”,按分类提交问题并附描述和截图;网页端可尝试右下角“?”按钮,登录后查看是否有意见反馈窗口;若需紧急处理,可检查消息列表中是否存有“抖音客服”对话记录,直接联系获取回复。 抖音网页版目前没有直接的…

    2026年8月28日
    500
  • 使用Flag变量实现Java菜单循环与返回

    本文将介绍如何在Java程序中使用flag变量控制菜单的循环和返回。通过设置和判断flag变量的值,可以实现从子菜单返回主菜单的功能,避免不必要的菜单重复显示,提升用户体验。本文将提供代码示例,详细解释flag变量的工作原理,并给出使用注意事项。 在Java程序中,经常需要构建交互式的菜单界面,让用…

    2026年8月28日
    000
  • win10系统怎么解除网速限制

    win10系统怎么解除网速限制win10系统怎么解除网速限制win10系统怎么解除网速限制win10系统怎么解除网速限制

    不少使用windows 10系统的朋友,在使用电脑时可能会遇到网速较慢的问题。这可能与网络设置中的某些限制有关。今天就来教大家如何通过调整设置来提升网速,只需设置“高级qos设置”,并将带宽限制调整为“0”即可。具体的操作步骤如下: Windows 10系统提升网速的方法 1、按下“Win+R”组合…

    2026年8月28日 用户投稿
    200
  • Win10提示Nvidia驱动不兼容怎么办?Win10提示Nvidia驱动不兼容的

    有不少朋友在使用win10系统电脑安装显卡驱动时,遇到提示“nvidia安装程序无法继续,此nvidia驱动程序与当前windows版本不兼容”的问题。那么,当这种情况发生时,我们应该如何处理呢?接下来就让我们一起了解具体的解决办法吧。 Win10提示Nvidia驱动不兼容的解决方法 1、将Wind…

    2026年8月28日
    100
  • 美团拼好饭app怎么添加地区

    在使用美团拼好饭 app 或美团外卖时,正确设置所在地区和详细地址是十分关键的步骤,这能确保你所点的美食准时、准确送达。接下来,将为你一步步讲解如何添加地区与收货地址。 美团拼好饭 app 添加地区方法 启动美团拼好饭 app 后,进入首页你会看到顶部通常会显示当前默认或自动定位的地区名称。点击该地…

    2026年8月28日
    100
  • win10电脑扬声器正常但是没有声音怎么回事

    win10电脑扬声器正常但是没有声音怎么回事win10电脑扬声器正常但是没有声音怎么回事win10电脑扬声器正常但是没有声音怎么回事win10电脑扬声器正常但是没有声音怎么回事

    想要在win10电脑上播放音乐或观看电影时却发现没有声音,虽然扬声器看起来正常却无法发声,这可能是由多种原因引起的。接下来,我们将介绍几种可能的解决办法。 工具/材料: 系统版本:Windows 10 设备类型:笔记本/台式机 解决步骤: 步骤一:排查驱动问题 首先,右键点击屏幕左下角的“开始”按钮…

    2026年8月28日 用户投稿
    000
  • excel怎么并排查看两个工作表_excel同步并排查看工作表方法

    可通过并排查看功能实现Excel两个工作表的同步浏览与对比。首先在“视图”选项卡中使用“新建窗口”创建多个窗口实例,再点击“并排查看”使两窗水平排列,便于核对数据;若需自定义布局,可取消并排模式后手动拖动窗口至屏幕两侧自由分屏;同时启用“同步滚动”功能后,滑动任一窗口时另一窗口会同步滚动,提升对比效…

    2026年8月28日
    000
  • windows怎么重启日志查看

    使用事件查看器中的事件ID 41、6005、6006和1074筛选系统日志,结合可靠性监视器与蓝屏分析工具,可准确区分正常重启与意外崩溃。 要查看Windows系统的重启日志,最直接且信息最丰富的途径就是使用“事件查看器”(Event Viewer)。它详细记录了系统启动、关机以及各种异常事件,是追…

    2026年8月28日
    100
  • CVE-2024-49112|Windows 轻量级目录访问协议(LDAP)远程代码执行漏洞

    0x00 引言 轻量级目录访问协议(LDAP)是一种广泛使用的网络协议,用于查询和管理分布式目录服务。作为一种开放标准,LDAP 能够高效地在网络环境中存储、组织和检索目录信息。该协议最初由密歇根大学研发,目标是提供一种简洁、快速的目录数据访问与操作方式。 0x05 参考资料 https://www…

    2026年8月28日
    000
  • Docker:应用容器引擎 Docker简介,Docker安装与启动(一步一步教你安装,不相信有看了这个教程还不会的人)

    一、%ignore_a_1%简介 1.1 什么是Docker Docker 是一个用Go语言开发的开源容器项目。通过利用操作系统现有的机制和特性,它实现了比传统虚拟机更轻量级的虚拟化(简单来说,Docker内嵌一个极小的系统,例如Linux仅需5M左右,Windows亦如此)。Docker实现的是内…

    2026年8月28日
    000
  • 懂车帝怎样搜索特定车型资讯_懂车帝车型信息精准搜索

    捷途纵横G700豪华电混越野SUV将于10月19日上市,预售价34.99万-42.99万元,定位中大型“全领域”车型,现已开启预售并提供4种配置。 如果您想在懂车帝上查找某款特定车型的最新资讯或详细信息,但面对海量内容感到无从下手,可以通过平台提供的多种精准搜索功能来快速定位目标。以下是实现高效查询…

    2026年8月28日
    000
  • 悟空浏览器如何设置打印网页时不带页眉页脚_悟空浏览器打印网页去掉页眉页脚方法

    在悟空浏览器中打印网页时,可通过打印预览设置取消页眉页脚:打开打印界面后展开更多设置并取消勾选“页眉和页脚”;2. 使用开发者工具添加CSS样式@media print { @page { margin: 0; } }可彻底去除页眉页脚及边距;3. 或将网页导出为PDF:选择虚拟PDF打印机并关闭页…

    2026年8月28日
    100
  • windows10激活码可以用几台电脑

    windows10激活码可以用几台电脑 如果是购买家庭版的正版只能激活一台。官网购买的 个人 Windows 10 家庭版系统,一个授权只允许激活一台电脑,如果你已经激活过 Windows 10 系统,并且使用微软账户登录操作系统使用,过程中微软会记住你所激活的那台电脑的硬件情况,并将授权自动关联绑…

    2026年8月28日
    200
  • excel数据透视表怎么去掉总计_excel数据透视表隐藏行列总计设置

    首先点击数据透视表任意单元格,依次进入“设计”选项卡→“总计”→选择“对行和列禁用”,可隐藏行列总计;若需单独控制,右键透视表标签→“数据透视表选项”→取消勾选“显示行总计”或“显示列总计”;对于多个透视表,可通过VBA代码批量关闭总计,提升效率。 如果您在使用Excel数据透视表时希望去除行或列的…

    2026年8月28日
    100

发表回复

登录后才能评论
关注微信