js网页简易计算器

野路子新人学习过程中的产物,参照知乎上的一篇文章里的练习做的(第三课第七个),有不符合科班出身常识的地方请指正。
因为大幅改过布局,所以会有些比较奇怪的标签用法,见谅。
截图:
截图

布局:

<body>
    <div id="Cbody">
        <p id="name">By-mirai2333</p>
        <div id="displayArea">0</div>
        <p id="num"></p>
        <div>
            <ul>
                <button class="clear">C</button>
                <button class="symbols">%</button>
                <button class="symbols">/</button>
                <button class="symbols">*</button>
                <button class="numbers">7</button>
                <button class="numbers">8</button>
                <button class="numbers">9</button>
                <button class="symbols">-</button>
                <button class="numbers">4</button>
                <button class="numbers">5</button>
                <button class="numbers">6</button>
                <button class="symbols">+</button>
                <button class="numbers">1</button>
                <button class="numbers">2</button>
                <button class="numbers">3</button>
                <button class="equal">=</button>
                <button class="zero">0</button>
                <button class="numbers">.</button>
            </ul>
        </div>
    </div>
</body>

样式:

    <style type="text/css">
        body{text-align: center;color: white;overflow: hidden;}
        p{margin: 0px;height: 20px;}
        ul{margin: 0px 0px 15px 12px;padding: 0px;position: relative;overflow: hidden;}
        button{margin: 16px 12px 0px 0px;padding: 0px; float: left;width: 60px;height: 40px;font-size: 20px;}
        #name{height: 20px;margin: 0px 3px 0px 3px;text-align: right;}
        #Cbody{width: 300px;height: 400px;background: black;margin: auto;}
        #displayArea{height: 84px;font:700 50px/100px Arial;background: #EEEEE0;color: black;text-align: right;}
        #num{font: 100 15px/20px Arial;position: absolute;top: 28px;left: 618px;width: 300px;height: 20px;color: black;text-align: right;}
        .zero{width: 132px;}
        .equal{height: 96px;position: absolute;bottom: 0px;right: 0px;}
    </style>

js的思路是这样的:所有的操作都是针对显示部分,显示部分分为当前显示已经成型的表达式。(以下简称为“当前”和“已经”)
共有三个状态:

  • 当前是数字,已经是符号或空(发生在键入符号后再键入数字,或初始状态)
    状态一空
    状态一符号
  • 当前和已经都是符号(发生在键入符号后)
    状态二
  • 当前和已经都是数字(发生在键入等号后)
    状态三
    三类按钮“数字”“符号”“等号”的onclick事件都是按照上述三个状态进行处理,“等号”把要计算的表达式整理放入已经,然后用eval()函数计算。
    JavaScript:
    <script type="text/javascript">
        window.onload=function(){
            var current = document.getElementById('displayArea');
            var already = document.getElementById('num');
            var buttons = document.getElementsByTagName('button');
            for (var i = 0; i < buttons.length; i++) {
                //数字键的单击事件
                if (buttons[i].className=="numbers"||buttons[i].className=="zero") {
                    buttons[i].onclick=function(){
                        //外层循环是为了配合里面的替换,处理符号加点的情况
                        if (!(/[\%\/\*\-\+]$/.test(current.innerText)&&this.innerHTML==".")) {
                            if (current.innerText.length<10) {
                                current.innerText+=this.innerHTML;
                                var text = current.innerText.replace(/^[0\%\/\*\-\+](\d)/,"$1");
                                current.innerText=text;
                            }
                        }
                    }
                //符号键的单击事件
                }else if (buttons[i].className=="symbols") {
                    buttons[i].onclick=function(){
                        //对应状态二,此时要把旧符号换成新的,依旧是状态二
                        if (/[\%\/\*\-\+]$/.test(current.innerText)) {
                            var text = already.innerHTML.replace(/([\%\/\*\-\+])$/,this.innerHTML);
                            already.innerHTML=text;
                            current.innerText=this.innerHTML;
                        //对应状态一,此时把当前数字移入已经并添加符号,变成状态二
                        }else if (/[\%\/\*\-\+\=]$/.test(already.innerHTML)){
                            already.innerHTML+=current.innerText+this.innerHTML;
                            current.innerText=this.innerHTML;
                        //对应状态三,把结果移入已经并添加符号,变成状态二
                        }else{
                            already.innerHTML = current.innerText+this.innerHTML;
                            current.innerText = this.innerHTML
                        }
                    }
                //清除
                }else if(buttons[i].className=="clear"){
                    buttons[i].onclick=function(){
                        already.innerHTML="";
                        current.innerText="0";
                    }
                //等号
                }else{
                    buttons[i].onclick=function(){
                        //状态二,去除符号并计算显示
                        if (/[\%\/\*\-\+\=]$/.test(current.innerText)) {
                            var text = already.innerHTML.replace(/([\%\/\*\-\+])$/,"");
                            already.innerHTML=text;
                            var text = eval(already.innerHTML);
                            current.innerText=text.toString().substr(0,10);
                        //状态一,当前移入已经并计算显示
                        }else if (/[\%\/\*\-\+\=]$/.test(already.innerHTML)) {
                            already.innerHTML+=current.innerText;
                            current.innerText=this.innerHTML;
                            var text = eval(already.innerHTML);
                            current.innerText=text.toString().substr(0,10);
                        }
                    }
                }
            }
        }
    </script>

下面附上知乎大佬的代码作为参考:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
body,div,p,ul,li,input{margin:0;padding:0;}
ul{list-style-type:none;}
a{color:#fff;outline:none;text-decoration:none;}
body{font:700 24px/1.5 Arial;}
#calc{position:relative;width:300px;background:#000;margin:10px auto;}
#calc p{color:#fff;text-align:right;font:12px/20px Arial;padding:0 5px;}
#calc .f-text{border:0;width:290px;height:84px;text-align:right;font:700 50px/84px Arial;background:url(img/inputBg.jpg) repeat-x;padding:0 5px;}
#calc ul{position:relative;overflow:hidden;zoom:1;background:url(img/bg.jpg);padding:0 0 17px 8px;}
#calc ul li{float:left;width:63px;height:41px;margin:17px 10px 0 0;}
#calc ul li a{display:block;width:63px;height:41px;line-height:41px;text-align:center;background:url(img/btn.png) no-repeat;}
#calc ul li a:hover{background-position:-63px 0;}
#calc ul li.btn-1 a{background-position:0 -41px;}
#calc ul li.btn-1 a:hover{background-position:-63px -41px;}
#calc ul li.btn-2{position:absolute;top:174px;right:0;height:99px;}
#calc ul li.btn-2 a{height:99px;line-height:99px;background-position:0 -164px;}
#calc ul li.btn-2 a:hover{background-position:-63px -164px;}
#calc ul li.btn-3{width:136px;}
#calc ul li.btn-3 a{width:136px;background-position:0 -82px;}
#calc ul li.btn-3 a:hover{background-position:0 -123px;}
#formula{position:absolute;top:20px;background:none;border:0;font:700 12px/1.5 Arial;width:280px;padding:3px 15px 0 5px;text-align:right;}
</style>
<script>
window.onload = function ()
{
    var oCalc = document.getElementById("calc");
    var aA = oCalc.getElementsByTagName("a");
    var aInput = oCalc.getElementsByTagName("input")[0];
    var oFormula = document.getElementById("formula");
    var s = false;
    var i = 0;

    for (i = 0; i < aA.length; i++){
        aA[i].onfocus = function ()
        {
            this.blur() 
        };
        aA[i].onclick = function ()
        {
            switch(this.innerHTML)
            {
                case "c":
                    aInput.value =  0;
                    oFormula.value = "";
                    break;
                case "%":
                    count("%")
                    break;
                case "÷":
                    count("/")
                    break;
                case "×":
                    count("*")
                    break;
                case "-":
                    count("-")
                    break;
                case "+":
                    count("+")
                    break;
                case "=":
                    s || (oFormula.value += aInput.value);
                    aInput.value = eval(oFormula.value.replace(/\%\/\*\-\+/,''));
                    aInput.value = aInput.value.substr(0,10).replace("NaN",0);
                    s = true;
                    break;
                case ".":
                    if(aInput.value.search(/[\.\%\/\*\-\+]/) != -1)
                    break;
                default:
                    s && (aInput.value = 0, oFormula.value = "", s = false);
                    aInput.value.length < 10 && (aInput.value = (aInput.value + this.innerHTML).replace(/^[0\%\/\*\-\+](\d)/,"$1"));
            }
        }   
    }

    function count(a)
    {

        if(s)
        {
            oFormula.value = aInput.value + a;
            aInput.value = a;   
            s = false;
        }
        else
        {
            /[\%\/\*\-\+]$/.test(aInput.value) || (oFormula.value += aInput.value);
            aInput.value = a;
            /[\%\/\*\-\+]$/.test(oFormula.value) || (oFormula.value += aInput.value);
            oFormula.value = oFormula.value.slice(-1) != a ? oFormula.value.replace(/.$/,a) : oFormula.value
        }
    }
}
</script>
<title>网页计算器</title>
</head>
<body>
<div id="calc">
    <p>By - Ferris QQ:21314130</p>
    <input class="f-text" type="text" readonly="readonly" maxlength="9" value="0" />
    <ul>
        <li class="btn-1"><a href="javascript:void(0)">c</a></li>
        <li class="btn-1"><a href="javascript:void(0)">%</a></li>
        <li class="btn-1"><a href="javascript:void(0)">÷</a></li>
        <li class="btn-1"><a href="javascript:void(0)">×</a></li>
        <li><a href="javascript:void(0)">7</a></li>
        <li><a href="javascript:void(0)">8</a></li>
        <li><a href="javascript:void(0)">9</a></li>
        <li class="btn-1"><a href="javascript:void(0)">-</a></li>
        <li><a href="javascript:void(0)">4</a></li>
        <li><a href="javascript:void(0)">5</a></li>
        <li><a href="javascript:void(0)">6</a></li>
        <li class="btn-1"><a href="javascript:void(0)">+</a></li>
        <li><a href="javascript:void(0)">1</a></li>
        <li><a href="javascript:void(0)">2</a></li>
        <li><a href="javascript:void(0)">3</a></li>
        <li class="btn-2"><a href="javascript:void(0)">=</a></li>
        <li class="btn-3"><a href="javascript:void(0)">0</a></li>
        <li><a href="javascript:void(0)">.</a></li>
    </ul>
    <input id="formula" type="text" readonly="readonly" value="" />
</div>
</body>
</html>

大佬的截图:
大佬的截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值