当前位置: 首页 > news >正文

练习小项目5:基础计算器

🎯 项目目标:

实现一个能进行基本四则运算(加减乘除)的网页计算器,用户输入两个数,通过点击按钮计算结果。

🛠️ 实现步骤参考:

  • 获取两个输入框和按钮、结果区域

  • 点击按钮时获取输入的值,并转为数字

  • 判断是否为有效数字

  • 输出两个数的计算结果

💡 要点讲解

  • input.value 是字符串,记得用 Number()parseFloat() 转换为数字;

  • NaN(不是数字)判断可以用 isNaN()

  • 输出前先清空结果区域。

HTML 部分结构(简化版):  

<input id="number1" placeholder="输入第一个数字">
<input id="number2" placeholder="输入第二个数字">
<button id="addBtn">加</button>
<button id="subtractbBtn">减</button>
<button id="multiplicationBtn">乘</button>
<button id="divisionBtn">除</button>
<p id="result"></p>

初版JavaScript 功能实现:

const number1 = document.getElementById('number1')
const number2 = document.getElementById('number2')
const addBtn = document.getElementById('addBtn')
const subtractbBtn = document.getElementById('subtractbBtn')
const multiplicationBtn = document.getElementById('multiplicationBtn')
const divisionBtn = document.getElementById('divisionBtn')
const result = document.getElementById('result')const calculate = (action) => {let resultNum = 0if (!number1.value.trim() || !number2.value.trim()) {alert("输入不能为空!")return}if (isNaN(Number(number1.value)) || isNaN(Number(number2.value))) {alert("请输入有效数字!")return}switch (action) {case 'add':resultNum = Number(number1.value) + Number(number2.value)breakcase 'subtractb':resultNum = Number(number1.value) - Number(number2.value)breakcase 'multiplication':resultNum = Number(number1.value) * Number(number2.value)breakcase 'division':resultNum = Number(number1.value) / Number(number2.value)break}return resultNum
}// 为每个按钮添加监听
addBtn.addEventListener('click', () => {result.textContent = `结果是:${calculate('add')}`
})subtractbBtn.addEventListener('click', () => {result.textContent = `结果是:${calculate('subtractb')}`
})multiplicationBtn.addEventListener('click', () => {result.textContent = `结果是:${calculate('multiplication')}`
})divisionBtn.addEventListener('click', () => {result.textContent = `结果是:${calculate('division')}`
})

Q:为什么要用 Number() 转换输入值?
A:因为 input.value 是字符串,直接加法会导致字符串拼接,比如 "2" + "3" 得到 "23",必须转换为数字才会进行加法。

页面效果展示 : 

 

❗遇到的问题和解决过程

🧩 问题1:return 了为什么还显示结果?

 这是因为 calculate 函数中虽然 return 了,但你仍然调用了 result.textContent = ...,哪怕返回的是 undefined,也会执行这一句。理解为:

result.textContent = `结果是:${undefined}`

解决方法:可以让 calculate 返回 undefined,调用后判断:

const res = calculate('add')
if (res !== undefined) {result.textContent = `结果是:${res}`
}

🧩 问题2:四个按钮分别写监听器会不会太重复?

这种写法虽然重复,但清晰易读,对初学非常友好。后期可以优化为事件委托方式(如下),但不是必须要改。

✅ 使用事件委托 + data-action 简化监听逻辑 

  • 事件委托,不再为每个按钮绑定事件,而是利用 事件冒泡,只监听一次就能捕捉所有子元素(按钮)的点击行为。
  • data-action 是一种 自定义 HTML 属性,叫做 data 属性(data-* attributes)。它的作用是:给 HTML 元素“打标签”,存储我们需要用到的额外信息。在 JavaScript 中,可以通过 .dataset.action 读取这个值。

HTML 部分结构(优化后):

<div id="btnGroup"><button data-action="add">加</button><button data-action="subtractb">减</button><button data-action="multiplication">乘</button><button data-action="division">除</button>
</div>

 优化后监听器的JavaScript 代码:

document.getElementById('btnGroup').addEventListener('click', (e) => {// 判断,确保用户点击的是按钮if (e.target.tagName === 'BUTTON') {const action = e.target.dataset.actionconst res = calculate(action)if (res !== undefined) {result.textContent = `结果是:${res}`}}
})

相关文章:

  • 算法竞赛 Java 高精度 大数 小数 模版
  • 2025年即时通讯APP如何抵御DDoS攻击?全链路防御方案与实战解析
  • 5.19本日总结
  • Axure跨页面交互:利用IFrame和JS实现父子页面菜单联动
  • 如何快速更换电脑浏览器ip:教程与注意事项
  • 煤化工数字化关键一步:Modbus TCP转Profinet网关实现全流程通信兼容
  • 基于 Vue 和 Node.js 实现图片上传功能:从前端到后端的完整实践
  • Ubuntu服务器部署多语言项目(Node.js/Python)方式实践
  • 学习STC51单片机07(芯片为STC89C52RC)
  • arm64适配系列文章-第八章-第二节-arm64环境上seata的部署-手动构建1.4.2版本镜像
  • 使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接
  • APP小程序抓包和下游代理
  • HTTP 协议基础
  • JVM 垃圾回收器
  • 魔族密码--dp+map+substr
  • uniapp vue 开发微信小程序 分包梳理经验总结
  • 2024CCPC吉林省赛长春邀请赛 Java 做题记录
  • MAC常用操作整理
  • codeup添加流水线docker自动化部署
  • RSP-BSP-1
  • 六旬老人举报违建后遭蒙面袭击续:海南陵水县住建局已暂停俩房产项目网签
  • 益阳通报“河水颜色异常有死鱼”:未发现排污,原因待鉴定
  • 武汉警方通报一起故意伤害案件:1人死亡,嫌疑人已被抓获
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布
  • 经济日报:政府采购监管篱笆要扎得更牢
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力