JS实现一个简易的计算器步骤详解

这次给大家带来JS实现一个简易的计算器步骤详解,JS实现一个简易的计算器的注意事项有哪些,下面就是实战案例,一起来看一下。

自己期末复习的时候就一直想要写一个计算器,闲暇的时候也在想具体怎么实现,觉得应该不难,但就是想写。昨天终于可以开始动工,刚开始还以为实现出来需要一个周左右至少两天的时间,想着实现完我就可以先回家两天了。但没想到整个实现过程算比较顺利吧,昨天用了大概六个小时完成了从设计到具体实现。

有大概一个月没怎么写代码了,整个大脑都不适应,反应也慢,一些基本的东西都有点模糊不清了。可能是原来就没有太理解,再加上没有其余练习,导致效率有些低。

正文

html代码:

JS实现一个简易的计算器步骤详解

计算器

登录后复制

 CSS代码:

*{margin: 0px; padding: 0px;}.errorHint{position: absolute; left: 130px; top:-282px;}.showError{border:1px solid red;}table{ border: 2px solid #996c33; width: 550px; padding: 10px; margin: 150px auto; background:url(https://github.com/crystalYY/calculator/blob/master/img/bg2.jpg?raw=trueg) left center no-repeat; border-radius: 10px;}table td{text-align: center;width: 100px;height: 40px;padding-left: 2px;padding-bottom: 2px;}table th{font-size: 18px;font-family:'楷体';color: #8B0000;}table td button{width: 98%;height: 98%;font-size: 16px;font-family: 'Microsoft yahei';background: none;color: #8B4726;outline:none;border:1px solid #000;border-radius: 5px;cursor: pointer;}table td input{width: 100%;margin: 10px 0;padding: 5px;border:1px solid #996c33;box-sizing: border-box;text-align: right;font-size: 16px;font-family: 'Microsoft yahei';}

登录后复制

JS代码:

var oinput=document.getElementsByTagName('input')[0];//获取外部样式function getStyle(obj, name){if(obj.currentStyle){return obj.currentStyle[name];}else{return getComputedStyle(obj, false)[name];}}//渐变动画function move(obj,attr,tar){clearInterval(obj.timer);obj.timer=setInterval(function(){var cur=parseInt(getStyle(obj,attr));var itarget=parseInt(tar);var speed=(itarget-cur)/6;speed=speed>0?Math.ceil(speed):Math.floor(speed);obj.style[attr]=parseInt(getStyle(obj,attr))+speed+'px';if(speed==0){clearInterval(obj.timer);}},30);}//事件绑定函数function addEvent(obj,ev,fun){if(obj.attachEvent){obj.attachEvent('on'+ev,fun);}else{obj.addEventListener(ev,fun,false);}}//阻止默认行为function stopEvent(ev){var e=ev||window.event;if(e.preventDefault){e.preventDefault();}else{e.returnValue=false;//ie}}//计算最终结果function getResult(){function evalResult(){var result=eval(oinput.value);return result;}//捕获异常try{var x=evalResult();return x;}catch (e){oinput.className='showError';var errorHint=document.getElementById('errorHint');move(errorHint,'top',0);setTimeout(function(){oinput.className='';move(errorHint,'top',-282);},2000);return oinput.value;}}//文本框获取焦点,错误提示消失//按下回车得到结果function enterResult(ev){var e=ev||window.event;if(e.keyCode==13){stopEvent(ev);//阻止enter键的默认行为var result=getResult();oinput.value=result;}}//绑定点击事件function init(){var otable=document.getElementsByTagName('table')[0];addEvent(otable,'keydown',function(ev){enterResult(ev);});addEvent(otable,'click',function(ev){stopEvent(ev);var e=ev||window.event;var itat=e.target||e.srcElement;var obtns=document.getElementsByTagName('button');if(itat.nodeName.toLowerCase()=='button'){for(var i=0;i<obtns.length;i++){obtns[i].style.borderColor='#000';}itat.style.borderColor='white';if(itat.className!='setChange'){if(oinput.value=='0'){oinput.value='';oinput.value+=itat.innerHTML;}else{oinput.value+=itat.innerHTML;}}else{if(itat.id=='backSpace'){oinput.value=oinput.value.toString().slice(0,-1);}else if(itat.id=='clearNum'){oinput.value='0';}else{var result=getResult();oinput.value=result;}}}});}init();

登录后复制

正常显示界面

JS实现一个简易的计算器步骤详解

错误提示界面

JS实现一个简易的计算器步骤详解

效果实现:http://codepen.io/crystalYY/pen/jAkNVz

实现思路

1.使用table画出整个界面。

借鉴了其他人已经实现了的结构,发现他们有一些人没有直接在td里写1,2,3或者退格什么的,而是又嵌套了一个button,我其实到现在也没有太理解为什么要这样,只是在排版的时候感觉到有些作用:因为margin对td 不起作用,只能设置padding。

2.使用eval函数计算最终结果,并捕获异常

function getResult(){   function evalResult(){    var result=eval(oinput.value);    return result;      }   //捕获异常   try{    var x=evalResult();    return x;   }   catch (e){    oinput.className='showError';    var errorHint=document.getElementById('errorHint');    move(errorHint,'top',0);    setTimeout(function(){     oinput.className='';     move(errorHint,'top',-282);    },2000);    return oinput.value;   }  }

登录后复制

eval函数第一次使用,w3c上对它的定义如下

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

有了这个函数得到最终结果就很容易了。我的思路是在用户输入要计算的式子时不加干预,最终的计算从input输入框中获取value值,然后把这个value值作为参数传递给eval,并使用try catch(exception)来捕获并处理异常。

3.通过事件代理绑定事件

因为每个button都需要有一个点击事件,如果一个一个去绑定,会导致代码十分的不简洁,而且效率也非常低。这时就可以考虑使用事件代理,由于事件冒泡的原理,我们可以把点击事件绑定在table上,然后通过判断事件发生的具体对象来做出不同的反应,调用不同的函数。

4.其他效果

可以根据自己的设计思路,添加其他的效果。我主要是添加了一个错误提示的动画:如果eval函数抛出异常,则从上面缓慢滑下一个图片,并且通过setTimeout来设置了停留的时间。

5.注意细节

在设置enter键按下获得结果的时候,keydown事件对象应该为整个table,并且应该阻止enter键的默认行为
获取元素样式时需要写一个兼容函数,因为obj.style.attr只能获取行间样式,要像获取外部样式需要用getComputedStyle(obj,false)[attr]或兼容IE的obj.currentStyle[attr]。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

不同版本React路由跳转方法汇总

Angular路由守卫使用步骤详解

以上就是JS实现一个简易的计算器步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2759771.html

(0)
上一篇 2025年3月8日 08:40:40
下一篇 2025年2月28日 22:56:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • node.js 命令行工具使用详解

    这次给大家带来node.js 命令行工具使用详解,node.js 命令行工具使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一. 先了解一下package.json 每个项目的根目录都有一个 package.json 文件,定义了这…

    2025年3月8日 编程技术
    200
  • vuex与组件联合使用步骤详解

    这次给大家带来vuex与组件联合使用步骤详解,vuex与组件联合使用的注意事项有哪些,下面就是实战案例,一起来看一下。 官方定义: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。我的理解就是,vuex就是前端的数据库。 1…

    2025年3月8日 编程技术
    200
  • js正则相关使用案例分享

    这次给大家带来js正则相关使用案例分享,js正则相关使用的注意事项有哪些,下面就是实战案例,一起来看一下。 JS正则表达式一条龙讲解(从原理和语法到JS正则) JS正则表达式大全(整理详细且实用) vaScript动态正则表达式问题请问正则…

    2025年3月8日
    200
  • JS Promise案例代码解析

    这次给大家带来JS Promise案例代码解析,JS Promise案例代码解析的注意事项有哪些,下面就是实战案例,一起来看一下。 1、约定 本文的 demo 代码有些是伪代码,不可以直接执行。 没有特殊说明,本文所有 demo 都是基于 …

    2025年3月8日
    200
  • jQuery实现模糊查询步骤详解

    这次给大家带来jQuery实现模糊查询步骤详解,jQuery实现模糊查询的注意事项有哪些,下面就是实战案例,一起来看一下。 需求:list列表内容很多,用户需要找出列表内容中的某些条目,只有当与用户输入值匹配的条目才显示出来。(后台无分页,…

    编程技术 2025年3月8日
    200
  • JS中JSON对象定义与取值实现步骤详解

    这次给大家带来JS中JSON对象定义与取值实现步骤详解,JS中JSON对象定义与取值实现的注意事项有哪些,下面就是实战案例,一起来看一下。 1.JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻…

    编程技术 2025年3月8日
    200
  • js合并数组合生成key:value步骤详解

    这次给大家带来js合并数组合生成key:value步骤详解,js合并数组合生成key:value的注意事项有哪些,下面就是实战案例,一起来看一下。 核心代码 // var activeSubjectsName = [“语文”, “数学”, …

    编程技术 2025年3月8日
    200
  • JS清除IE浏览器缓存的方法

    本文为大家详细介绍下js中自动清除ie缓存的几种方法,大家可以根据自己的需求自由选择适合自己的,希望对大家学习js有所帮助 js中自动清除ie缓存方法 — 常用 对于动态文件,比如 index.asp?id=… 或者 index…

    编程技术 2025年3月8日
    200
  • getJSON()异步请求服务器返回json格式数据(图文教程)

    下面我就为大家带来一篇使用getjson()异步请求服务器返回json格式数据的实现。现在就分享给大家,也给大家做个参考。 我们可以使用jquery的getJSON()方法请求服务器返回json格式数据: js代码: function te…

    2025年3月8日
    200
  • AngularJS tab栏实现和mvc小案例(图文教程)

    这篇文章主要介绍了angularjs tab栏实现和mvc小案例,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下 tab栏: 代码: nbsp;html>        Tab 标签    body { margin: 0…

    2025年3月8日
    200

发表回复

登录后才能评论