本文详解如何使用现代 javascript(事件委托 + map/reduce)正确实现多个数字输入框的实时求和,避免累加错误、nan 异常及 html 语义问题。
本文详解如何使用现代 javascript(事件委托 + map/reduce)正确实现多个数字输入框的实时求和,避免累加错误、nan 异常及 html 语义问题。
在 Web 表单开发中,常见的需求是:当用户在多个 <input> 中输入数字时,页面自动实时计算总和并显示在指定位置。但初学者常陷入一个典型陷阱——在事件监听器内反复累加(如 tot += ...),导致每次输入都基于上一次的累计值继续叠加,形成类似 1→3→6→10... 的错误算术增长。
根本原因在于原始代码中:
✅ 正确解法采用事件委托 + 函数式编程思想:
以下是推荐实现代码:
<div id="scoreContainer"> <p><input type="number" class="score" id="myInputField12" /></p> <p><input type="number" class="score" id="myInputField13" /></p> <p><input type="text" class="result" id="total" readonly /></p></div>
const scoreContainer = document.getElementById('scoreContainer');const fields = scoreContainer.querySelectorAll('.score');const totalField = document.getElementById('total');scoreContainer.addEventListener('input', () => { const sum = [...fields].map(field => { const num = +field.value; return isNaN(num) ? 0 : num; }).reduce((acc, curr) => acc + curr, 0); // 初始值设为 0,确保空数组返回 0 totalField.value = sum;});
? 关键注意事项:
该方案简洁、高效、无副作用,完美解决“越输越大”的逻辑 bug,是现代前端实时计算的推荐范式。