最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實(shí)現(xiàn)一個(gè)簡易的計(jì)算器實(shí)例代碼

 更新時(shí)間:2018年05月10日 11:25:23   作者:螢火蟲塔莉  
這篇文章主要介紹了JavaScript實(shí)現(xiàn)一個(gè)簡易的計(jì)算器實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過來看看吧

自己期末復(fù)習(xí)的時(shí)候就一直想要寫一個(gè)計(jì)算器,閑暇的時(shí)候也在想具體怎么實(shí)現(xiàn),覺得應(yīng)該不難,但就是想寫。昨天終于可以開始動(dòng)工,剛開始還以為實(shí)現(xiàn)出來需要一個(gè)周左右至少兩天的時(shí)間,想著實(shí)現(xiàn)完我就可以先回家兩天了。但沒想到整個(gè)實(shí)現(xiàn)過程算比較順利吧,昨天用了大概六個(gè)小時(shí)完成了從設(shè)計(jì)到具體實(shí)現(xiàn)。

有大概一個(gè)月沒怎么寫代碼了,整個(gè)大腦都不適應(yīng),反應(yīng)也慢,一些基本的東西都有點(diǎn)模糊不清了??赡苁窃瓉砭蜎]有太理解,再加上沒有其余練習(xí),導(dǎo)致效率有些低。

正文

html代碼:

<div class="errorHint" id="errorHint"><img src="https://github.com/crystalYY/calculator/blob/master/img/error.png?raw=true"></div>
	<table cellpadding="0">
		<tr>
			<th colspan="5">計(jì)算器</th>
		</tr>
		<tr>
			<td colspan="5">
				<input type="text" value="0" name="showResult">
			</td>
		</tr>
		<tr>
			<td><button>7</button></td>
			<td><button>8</button></td>
			<td><button>9</button></td>
			<td><button class="setChange" id="backSpace">退格</button></td>
			<td><button class="setChange" id="clearNum">C</button></td>
		</tr>
		<tr>
			<td><button>4</button></td>
			<td><button>5</button></td>
			<td><button>6</button></td>
			<td><button>+</button></td>
			<td><button>-</button></td>
		</tr>
		<tr>
			<td><button>1</button></td>
			<td><button>2</button></td>
			<td><button>3</button></td>
			<td><button>*</button></td>
			<td><button>/</button></td>
		</tr>
		<tr>
			<td><button>0</button></td>
			<td><button>.</button></td>
			<td><button>%</button></td>
			<td colspan="2"><button class="setChange" id="gainResult">Enter</button></td>
		</tr>
	</table>
	<script type="text/javascript" src='index.js'>		
	</script>

 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];
			}
		}
		//漸變動(dòng)畫
		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);
		}
		//事件綁定函數(shù)
		function addEvent(obj,ev,fun){
			if(obj.attachEvent){
				obj.attachEvent('on'+ev,fun);
			}else{
				obj.addEventListener(ev,fun,false);
			}
		}
		//阻止默認(rèn)行為
		function stopEvent(ev){
			var e=ev||window.event;
			if(e.preventDefault){
				e.preventDefault();
			}
			else{
				e.returnValue=false;//ie
			}
		}
		//計(jì)算最終結(jié)果
		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;
			}
		}
		//文本框獲取焦點(diǎn),錯(cuò)誤提示消失
		//按下回車得到結(jié)果
		function enterResult(ev){
			var e=ev||window.event;
			if(e.keyCode==13){
				stopEvent(ev);//阻止enter鍵的默認(rèn)行為
				var result=getResult();
				oinput.value=result;
			}
		}
		//綁定點(diǎn)擊事件
		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();

正常顯示界面

錯(cuò)誤提示界面

效果實(shí)現(xiàn)http://codepen.io/crystalYY/pen/jAkNVz

實(shí)現(xiàn)思路

1.使用table畫出整個(gè)界面。

借鑒了其他人已經(jīng)實(shí)現(xiàn)了的結(jié)構(gòu),發(fā)現(xiàn)他們有一些人沒有直接在td里寫1,2,3或者退格什么的,而是又嵌套了一個(gè)button,我其實(shí)到現(xiàn)在也沒有太理解為什么要這樣,只是在排版的時(shí)候感覺到有些作用:因?yàn)閙argin對(duì)td 不起作用,只能設(shè)置padding。

2.使用eval函數(shù)計(jì)算最終結(jié)果,并捕獲異常

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函數(shù)第一次使用,w3c上對(duì)它的定義如下

eval() 函數(shù)可計(jì)算某個(gè)字符串,并執(zhí)行其中的的 JavaScript 代碼。

有了這個(gè)函數(shù)得到最終結(jié)果就很容易了。我的思路是在用戶輸入要計(jì)算的式子時(shí)不加干預(yù),最終的計(jì)算從input輸入框中獲取value值,然后把這個(gè)value值作為參數(shù)傳遞給eval,并使用try catch(exception)來捕獲并處理異常。

3.通過事件代理綁定事件

因?yàn)槊總€(gè)button都需要有一個(gè)點(diǎn)擊事件,如果一個(gè)一個(gè)去綁定,會(huì)導(dǎo)致代碼十分的不簡潔,而且效率也非常低。這時(shí)就可以考慮使用事件代理,由于事件冒泡的原理,我們可以把點(diǎn)擊事件綁定在table上,然后通過判斷事件發(fā)生的具體對(duì)象來做出不同的反應(yīng),調(diào)用不同的函數(shù)。

4.其他效果

可以根據(jù)自己的設(shè)計(jì)思路,添加其他的效果。我主要是添加了一個(gè)錯(cuò)誤提示的動(dòng)畫:如果eval函數(shù)拋出異常,則從上面緩慢滑下一個(gè)圖片,并且通過setTimeout來設(shè)置了停留的時(shí)間。

5.注意細(xì)節(jié)

在設(shè)置enter鍵按下獲得結(jié)果的時(shí)候,keydown事件對(duì)象應(yīng)該為整個(gè)table,并且應(yīng)該阻止enter鍵的默認(rèn)行為
獲取元素樣式時(shí)需要寫一個(gè)兼容函數(shù),因?yàn)閛bj.style.attr只能獲取行間樣式,要像獲取外部樣式需要用getComputedStyle(obj,false)[attr]或兼容IE的obj.currentStyle[attr]。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序之頁面攔截器的示例代碼

    微信小程序之頁面攔截器的示例代碼

    本篇文章主要介紹了微信小程序之頁面攔截器的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • javascript 判斷整數(shù)方法分享

    javascript 判斷整數(shù)方法分享

    本文介紹了使用javascript判斷整數(shù)的2種方法中的一種正則判斷,因?yàn)橹鹱峙袛嘈侍拖铝?,有相同需求的小伙伴們參考?/div> 2014-12-12
  • JavaScript設(shè)計(jì)模式之構(gòu)造器模式(生成器模式)定義與用法實(shí)例分析

    JavaScript設(shè)計(jì)模式之構(gòu)造器模式(生成器模式)定義與用法實(shí)例分析

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之構(gòu)造器模式(生成器模式)定義與用法,結(jié)合實(shí)例形式分析了javascript構(gòu)造器模式的概念、原理、與工廠模式的區(qū)別以及相關(guān)使用方法,需要的朋友可以參考下
    2018-07-07
  • JS庫之Particles.js中文開發(fā)手冊(cè)及參數(shù)詳解

    JS庫之Particles.js中文開發(fā)手冊(cè)及參數(shù)詳解

    因?yàn)樽约盒枰霎a(chǎn)品,所以一個(gè)好的UI界面也是很重要的,發(fā)現(xiàn)這種散射的原子顆粒特效還不錯(cuò)。今天腳本之家小編把Particles.js中文開發(fā)手冊(cè)及particles.js參數(shù)分享給大家,需要的朋友參考下吧
    2017-09-09
  • JS實(shí)現(xiàn)選項(xiàng)卡實(shí)例詳解

    JS實(shí)現(xiàn)選項(xiàng)卡實(shí)例詳解

    這篇文章主要介紹了JS實(shí)現(xiàn)選項(xiàng)卡的方法,結(jié)合實(shí)例形式詳細(xì)講述了JavaScript實(shí)現(xiàn)選項(xiàng)卡的布局與功能實(shí)現(xiàn)的完整步驟及相關(guān)技巧,需要的朋友可以參考下
    2015-11-11
  • JS防抖節(jié)流函數(shù)的實(shí)現(xiàn)與使用場景

    JS防抖節(jié)流函數(shù)的實(shí)現(xiàn)與使用場景

    在行走江湖的過程中,會(huì)出現(xiàn)很多性能優(yōu)化的問題來讓你手足無措,那么這篇文章主要給大家介紹了關(guān)于JS防抖節(jié)流函數(shù)的實(shí)現(xiàn)與使用場景,針對(duì)這兩個(gè)問題來為你答疑解惑,需要的朋友可以參考下
    2021-07-07
  • javascript 獲取鼠標(biāo)的絕對(duì)位置 event

    javascript 獲取鼠標(biāo)的絕對(duì)位置 event

    javascript 獲取鼠標(biāo)的絕對(duì)位置 event
    2009-06-06
  • javascript實(shí)現(xiàn)隨機(jī)生成DIV背景色

    javascript實(shí)現(xiàn)隨機(jī)生成DIV背景色

    這篇文章主要介紹了javascript實(shí)現(xiàn)隨機(jī)生成DIV背景色的具體代碼,如何設(shè)置DIV背景色為隨機(jī)色,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 分享11個(gè)常用JavaScript小技巧

    分享11個(gè)常用JavaScript小技巧

    在我們的日常開發(fā)過程中,我們經(jīng)常會(huì)遇到數(shù)字與字符串轉(zhuǎn)換,檢查對(duì)象中是否存在對(duì)應(yīng)值,條件性操作對(duì)象數(shù)據(jù),過濾數(shù)組中的錯(cuò)誤值,等等這類處理。本文整理出了一些常用的小技巧,希望大家能喜歡
    2022-06-06
  • javascript容錯(cuò)處理代碼(屏蔽js錯(cuò)誤)

    javascript容錯(cuò)處理代碼(屏蔽js錯(cuò)誤)

    本文主要介紹了javascript的容錯(cuò)處理代碼。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01

最新評(píng)論

柳江县| 交口县| 宁陕县| 民勤县| 邵东县| 微博| 潍坊市| 白山市| 沾益县| 新泰市| 吴旗县| 玉山县| 肃北| 德兴市| 长白| 江西省| 夏河县| 明水县| 资源县| 都匀市| 开鲁县| 和林格尔县| 海林市| 浏阳市| 壤塘县| 思南县| 宜宾县| 凯里市| 稻城县| 白朗县| 阆中市| 长宁县| 潢川县| 安阳县| 凤台县| 西乌珠穆沁旗| 兴海县| 昌宁县| 达州市| 十堰市| 株洲市|