js简易计算器底层运算逻辑(带撤销功能)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
.wrap{
width: 400px;
height: 430px;
margin: 20px auto;
border: 1px solid #000;
}
input{
width: 396px;
height: 26px;
text-align: right;
}
.box{
padding-top: 10px;
width: 400px;
height: 300px;
text-align: center;
}
button{
width: 25%;
height: 30px;
cursor: pointer;
margin:2px 10px;
}
</style>
</head>
<body>
<div class="wrap">
<input type="text" name="result" id="result" value="" />
<div class="box">
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
<button>6</button>
<button>7</button>
<button>8</button>
<button>9</button>
<button>0</button>
<button>+</button>
<button>-</button>
<button>*</button>
<button>/</button>
<button>=</button>
<button>back</button>
</div> </div>
</body> <script type="text/javascript">
var buttonList = document.getElementsByTagName('button');
var input = document.getElementById('result');
var dataSource = [];
for(var i = 0; i < buttonList.length; i++){
buttonList[i].onclick = function(){
var str = this.innerHTML;
if(str == 'back'){
calcBack();
return ;
}else if(dataSource[dataSource.length -1] == '='){
dataSource = []; //上一次是=,再点击则清空
} dataSource.push(str);
dataSource = handle(dataSource);
handReult(dataSource);
}
} function calcBack(){
var arr = dataSource.join('').split('');
arr.pop();
dataSource = handle(arr);
handReult(dataSource);
} function show(arr){
var result = arr.join('');
input.value = result;
} function handle(newArr){
var temp = []; //处理好的数据
var str = ''; for(var i = 0; i < newArr.length; i++){
var num = Number(newArr[i]);
if(num || num === 0){
//一定是数字
str = str+newArr[i];
}else{
//字符串,过滤重复的 + - * /
if(str != ''){
temp.push(str);
temp.push(newArr[i]);
str ='';
}
} }
if(str != ''){
temp.push(str);
str = '';
} //去掉前面的0
for(var i = 0 ; i < temp.length; i++){
var num = Number(temp[i]);
if(num || num == 0){
temp[i] = Number(temp[i]);
}
} return temp; } function handReult(temp){
temp = JSON.parse(JSON.stringify(temp));
//判断是否要计算
if(temp[temp.length-1] == '='){
var result = calcu(temp);
temp.push(result);
} //显示
show(temp);
} function calcu(arr){
var newArr = JSON.parse(JSON.stringify(arr)); //复制数组,去掉引用 //计算除法
while(newArr.indexOf('/') != -1){
var index = newArr.indexOf('/');
var num1 = newArr[index-1];
var num2 = newArr[index+1];
var result = num1/num2;
newArr.splice(index-1,3,result);
} //乘法
while(newArr.indexOf('*') != -1){
var index = newArr.indexOf('*');
var num1 = newArr[index-1];
var num2 = newArr[index+1];
var result = num1*num2;
newArr.splice(index-1,3,result);
} //减法
while(newArr.indexOf('-') != -1){
var index = newArr.indexOf('-');
var num1 = newArr[index-1];
var num2 = newArr[index+1];
var result = num1-num2;
newArr.splice(index-1,3,result);
} //加法
while(newArr.indexOf('+') != -1){
var index = newArr.indexOf('+');
var num1 = newArr[index-1];
var num2 = newArr[index+1];
var result = num1+num2;
newArr.splice(index-1,3,result);
}
return newArr[0];
}
</script>
</html>
js简易计算器底层运算逻辑(带撤销功能)的更多相关文章
- Android实训案例(一)——计算器的运算逻辑
Android实训案例(一)--计算器的运算逻辑 应一个朋友的邀请,叫我写一个计算器,开始觉得,就一个计算器嘛,很简单的,但是写着写着发现自己写出来的逻辑真不严谨,于是搜索了一下,看到mk(没有打广告 ...
- JS简易计算器的实现,以及代码的优化
用JS实现简易计算器 首先创建结构和样式 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- as3.0划线带撤销功能
package com{ import flash.display.MovieClip; import flash.display.SimpleButton; import flash.events. ...
- 用js制作简易计算器及猜随机数字游戏
<!doctype html><html><head> <meta charset="utf-8"> <title>JS ...
- 剖析简易计算器带你入门微信小程序开发
写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...
- 原生JS实现简易计算器
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 大一C语言学习笔记(10)---编程篇--制作简易计算器,支持加,减,乘,除,取余运算,要求 0 bug
博主自开学初就一直在努力为自己的未来寻找学习方向,学习编程嘛,尽量还是要抱大腿的,所以我就加入了我们学校的智能设备研究所,别的不说,那的学长们看起来是真的很靠谱,学长们的学习氛围也超级浓厚,所以我就打 ...
- 使用html+css+js实现简易计算器
使用html+css+js实现简易计算器, 效果图如下: html代码如下: <!DOCTYPE html> <html lang="en"> <he ...
- 项目:JS实现简易计算器案例
组件化网页开发下的: 步骤一:让页面动起来的JavaScript深入讲解 的 项目:JS实现简易计算器案例
随机推荐
- /usr/bin/ld: 找不到 -lmsc----解决方案
系统的默认搜索依赖库路径为,/usr/local/lib 在camkelists.txt文件中对可执行文件链接libmsc.so add_executable(iat_publish src/iat_ ...
- MySQL命令:约束
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性 约束分类: 约束类型与关键字: 主键 PRIMARY KEY 默认值 DEFAULT 唯一 UN ...
- HTML响应状态码
https://www.restapitutorial.com/httpstatuscodes.html
- Xml文件删除节点总是留有空标签
---恢复内容开始--- 在删除Xml文件时,删除成功后还有标签,让我百思不得其解,因为xml文档中留着这空标签会对后续的操作带来很多麻烦,会取出空值,人后导致程序中止. 导致这种情况的原因是删除xm ...
- 20个有趣的Linux命令
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- iOS-原生纯代码约束总结(二)之 AutoLayout
一,概述 AutoLayout相比AutoResizing更加实用,是可以完全替代AutoResizing的一种自动布局方式.而在使用AutoLayout前,我们必须理解一个属性,那就是transla ...
- instrument之Time Profiler总结
一.工欲善其事必先利其器 time profile时间分析工具用来检测应用CPU的使用情况,可以看到应用程序中各个方法正在消耗CPU时间,使用大量CPU不一定是个问题.客户端中动画就对CPU依赖就非常 ...
- mysql缓存分析
- 在VMware运行Linux下,密码错误的原因
抱歉,没有奏效,请再试一次 密码明明是正确的,但依旧报错 原因: 密码中有大写,但键盘中的大写按键在登录界面无效,需要按住shift才能实现大写.
- 转:Java中Scanner类和BufferReader类之间的区别
原文地址:https://blog.csdn.net/u014717036/article/details/52227782 java.util.Scanner类是一个简单的文本扫描类,它可以解析基本 ...