前端使用 JavaScript 实现一个简易计算器,没有难度,但是里面有些小知识还是需要注意的,算是一次基础知识回顾吧。

题目

实现一个简易版的计算器,需求如下:

1、除法操作时,如果被除数为0,则结果为0
2、结果如果为小数,最多保留小数点后两位,如 2 / 3 = 0.67(显示0.67), 1 / 2 = 0.5(显示0.5)
3、请阅读并根据提示补充完成函数initEvent、result和calculate
4、请不要手动修改html和css
5、不要使用第三方插件

实现

HTML 文件

<div class="calculator"><header class="cal-header">简易计算器</header><main class="cal-main"><div class="origin-value">0</div><div class="cal-keyboard"><ul class="cal-items"><li data-action="num">7</li><li data-action="num">8</li><li data-action="num">9</li><li data-action="operator">÷</li><li data-action="num">4</li><li data-action="num">5</li><li data-action="num">6</li><li data-action="operator">x</li><li data-action="num">1</li><li data-action="num">2</li><li data-action="num">3</li><li data-action="operator">-</li><li data-action="num">0</li><li data-action="operator">清空</li><li data-action="operator">=</li><li data-action="operator">+</li></ul></div></main>
</div>

CSS 文件

body, ul, li,select {margin: 0;padding: 0;box-sizing: border-box;
}
ul,li {list-style: none;}
.calculator {max-width: 300px;margin: 20px auto;border: 1px solid #eee;border-radius: 3px;
}
.cal-header {font-size: 16px;color: #333;font-weight: bold;height: 48px;line-height: 48px;border-bottom: 1px solid #eee;text-align: center;
}
.cal-main {font-size: 14px;
}
.cal-main .origin-value {padding: 15px;height: 40px;line-height: 40px;font-size: 20px;text-align: right;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;
}
.cal-main .origin-type,
.cal-main .target-type {padding-left: 5px;width: 70px;font-size: 14px;height: 30px;border: 1px solid #eee;background-color: #fff;vertical-align: middle;margin-right: 10px;border-radius: 3px;
}
.cal-keyboard {overflow: hidden;
}
.cal-items {overflow: hidden;
}
.cal-items li {user-select: none;float: left;display: inline-block;width: 75px;height: 75px;text-align: center;line-height: 75px;border-top: 1px solid #eee;border-left: 1px solid #eee;box-sizing: border-box;
}
li:nth-of-type(4n+1) {border-left: none;
}
li[data-action=operator] {background: #f5923e;color: #fff;
}
.buttons {float: left;width: 75px;
}
.buttons .btn {width: 75px;background-color: #fff;border-top: 1px solid #eee;border-left: 1px solid #eee;height: 150px;line-height: 150px;text-align: center;
}
.btn-esc {color: #ff5a34;
}
.btn-backspace {position: relative;
}

JavaScript 文件

var Calculator = {init: function () {var that = this;if (!that.isInited) {that.isInited = true;// 保存操作信息// total: Number, 总的结果// next: String, 下一个和 total 进行运算的数据// action: String, 操作符号that.data = {total: 0, next: '', action: ''};that.bindEvent();}},bindEvent: function () {var that = this;// 获取 .cal-keyboard 元素var keyboardEl = document.querySelector(".cal-keyboard");keyboardEl && keyboardEl.addEventListener('click', function (event) {// 获取当前点击的dom元素var target = event.target;// 获取target的 data-action 值var action = target.dataset.action;// 获取target的内容var value = target.innerText;if (action === 'num' || action === 'operator') {that.result(value, action === 'num');}});},result: function (action, isNum) {var that = this;var data = that.data;if (isNum) {data.next = data.next === '0' ? action : (data.next + action);!data.action && (data.total = 0);} else if (action === '清空') {// 设置清空时的对应状态data.total = 0;data.next = "";data.action = "";} else if (action === '=') {if (data.next || data.action) {data.total = that.calculate(data.total, data.next, data.action);data.next = '';data.action = '';}} else if (!data.next) {data.action = action;} else if (data.action) {data.total = that.calculate(data.total, data.next, data.action);data.next = '';data.action = action;} else {data.total = +data.next || 0;data.next = '';data.action = action;}// 获取 .origin-value 元素var valEl = document.querySelector(".origin-value");// print(data)valEl && (valEl.innerHTML = data.next || data.total || '0');},calculate: function (n1, n2, operator) {n1 = +n1 || 0;n2 = +n2 || 0;if (operator === '÷') {// 获取除法的结果return n2 === 0 ? 0 : Math.floor((n1 / n2) * 100) / 100;} else if (operator === 'x') {// 获取乘法的结果return Math.floor((n1 * n2) * 100) / 100;} else if (operator === '+') {// 获取加法的结果return Math.floor((n1 + n2) * 100) / 100;} else if (operator === '-') {// 获取减法的结果return Math.floor((n1 - n2) * 100) / 100;}}
};
Calculator.init();

分析

主要分析一下本题中 JavaScript 部分涉及的知识点。

事件委托

我们没有给数字和符号元素分别添加点击事件,而是通过给它们的父元素 .cal-keyboard 添加点击事件,再通过事件冒泡获得它父元素绑定的事件响应,使用事件委托有以下优点:

  • 减少内存消耗
  • 可以方便地动态添加或者删除元素
  • 管理的函数减少
  • 减少操作 DOM 节点的次数,提高性能

事件委托的步骤:

  1. 给父元素绑定响应事件
  2. 监听子元素的冒泡事件
  3. 获取触发事件的目标元素

保留小数位

大家的第一反应可能是使用 toFixed() 方法,但是这个方法在小数位不足的情况下会在后面补 0,比如:

const num = 0.8;
num.toFixed(2) // 0.80

可以看到,这个是不符合要求的。

还有一个问题需要注意:小数的相加结果可能并不符合预期,比如:

console.log(0.2 + 0.4) // 0.6000000000000001

这里我们建议使用 Math.floor() 方法来处理小数位,先给结果乘以 100,再通过 Math.floor() 取得整数部分,然后除以 100,得到符合要求的结果,比如:

const num1 = 0.5;
const num2 = 0.68751;
Math.floor(num1 * 100)/100      // 0.5
Math.floor(num2 * 100)/100      // 0.68
~
本文完

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

前端 JavaScript 实现一个简易计算器相关推荐

  1. 用JavaScript实现一个简易计算器功能

    简易计算器 文章目录 简易计算器 界面一览 一.需求 二.body创建整体显示外观 三.css样式 四.JavaScript事件函数 五.小结 界面一览 一.需求 1.构建出计算器外观. 2.显示屏跟 ...

  2. html制作简易计算机,用JavaScript制作一个简易计算器

    制作出来是一个五行三列的表格,第一行是标题简易计算器,第二行是第一个数,第三行是第二个数,第四行是计算机结果,第五行是说明步骤,第三列是加减乘除四种运算方法. 简易计算器 table{ border: ...

  3. 使用“三剑客”做一个简易计算器

    使用HTML.原生CSS以及原生JavaScript做一个简易计算器 <!DOCTYPE html> <html lang="en"><head> ...

  4. 原生JavaScript实现的简易计算器

    tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( 'ω' )و 最近一直没有写博客 因为一直忙着预习考试内容 什么偏微分啊.数值分析啊.计算机图形学啊.信息论- 在未来一个月可能会很忙 整理前 ...

  5. js 月份间隔计算器_15分钟用JS做一个简易计算器

    原标题:15分钟用JS做一个简易计算器 前言 这个小练手旨在帮助刚上手学习Java的同学练习最基本的Js知识,大神勿喷哈,由于这个是非常简易的计算器,可以完成的功能有加减乘除和AC(清屏),DEL(退 ...

  6. 用HTML5制作一个简易计算器

    用H5制作一个简易计算器 最近刚学JavaScript,之后紧接着做了一个简易的计算器,能够实现数字的加减乘除运算. 首先,先用HTML5搭建好计算器大体框架.我这里用了两个表格,一个充当显示器,另一 ...

  7. linux shell 计算器 除0,用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1....

    用shell写一个简易计算器,可以实现加.减.乘.除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2#!/bin/bash if [ $# -ne 3 ] then echo &quo ...

  8. linux脚本计算器加减乘除,用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1....

    用shell写一个简易计算器,可以实现加.减.乘.除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2#!/bin/bash if [ $# -ne 3 ] then echo &quo ...

  9. 如何使用 Java AWT 创建一个简易计算器

    本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工具包)是一个有助于构建 GUI 的 API (图形用户界面)基 ...

最新文章

  1. Cell重磅:记忆研究的突破进展!在诺奖成果基础上,用“全光学”组合来“操纵记忆”...
  2. 利用tab_control控件在对话框中加入属性页的方法详细介绍
  3. 使用机器学习检测TLS 恶意加密流——业界调研***有开源的数据集,包括恶意证书的,以及恶意tls pcap报文***...
  4. .net 引用Com组件的几种方案
  5. azure db 设置时区_在Azure Cosmos DB中应用字段运算符和对象
  6. Sharepoint 浅谈 [转]
  7. java ef 引用问题_EF Core - 自引用实体
  8. IMAP协议与imbox第三方库读取所有邮件
  9. MathType:在公式中插入空格
  10. win7美化_美化你的win10桌面,让你的电脑更美观
  11. 日志易智能日志分析助力农信银双十一运维降本增效
  12. 推荐电视剧 后宫甄嬛传 2012
  13. 矢量合成和分解的法则_矢量合成和分解的方法--平行四边形法则.ppt
  14. 微信小程序和uniapp开发工具
  15. mysql-community-server是什么?
  16. 航天飞机和马屁股有什么关系?
  17. 怎么画正五边形步骤_正五边形尺规画法的理论探索
  18. 简单名称值对节点类NameValuePair
  19. Osbypass苹果手机激活锁停用Hello密码锁绕ID屏幕锁密码支持三网(移动、联通、电信)国行版手机解锁打电话4G等支持打电话、短信、4G上网、重启、通知、iCloud登录
  20. Linux中利用sed替换字符

热门文章

  1. 原生JavaScript如何解决父元素查找指定类名的子元素的问题
  2. 【问题解决方案】git clone失败的分析和解决
  3. Notepad ++添加到每一行
  4. 在C#中将字符串转换为字节数组
  5. 看看什么是藏匿而不申请[重复]
  6. 如何在C#中从同步方法调用异步方法?
  7. android真机调试步骤
  8. SpringMVC控制类的Controller方法返回值
  9. windows 电脑属性调用程序
  10. python动态属性_Python进阶之@property动态属性的实现